2017-05-10 6 views
0

J'ai une exigence pour obtenir le nom de la règle dans ma fonction personnalisée où je l'utilise pour un traitement, Ci-dessous le code est la façon dont je suis en train de faire. Si ce n'est pas possible directement, existe-t-il une alternative. BTW Actuellement, nous utilisons Drools 5.6Drools Comment obtenir ruleContext quand et quand?

import org.drools.spi.KnowledgeHelper;  
      function boolean printRuleName(KnowledgeHelper context) { 
       System.out.println(context.getRule().getName()); 
       return true; 
      } 

      // rule values at C15, header at C10 

      rule "MY_RULE_15" 
       salience 65521 
       when 

        k:StatefulKnowledgeSession(true == "true") 
        //context: KnowledgeHelper(true=="true") 
        m:Map(true == "true") 
        Map((printRuleName(kcontext) == "true") 

       then 
        System.out.println(kcontext.getRule().getName()); 
    //this works in action 
     end 
     //Map((printRuleName(kcontext) == "true") this is causing null pointer exception, kcontext is not getting injected 

Répondre

0

Il n'y a pas de contexte règle sur le côté gauche d'une règle, à savoir, lors de l'évaluation de l'état.

Si vous avez vraiment besoin du nom de la règle sur le côté gauche (ce qui ne va pas être utile de toute façon), vous devrez écrire le littéral de chaîne contenant le nom de la règle en tant que paramètre.

Je suggère que la raison de cette exigence soit passée en revue.

Notez que printRuleName(kcontext) == "true" ne sera jamais vrai car il compare un booléen avec une chaîne. En outre, comparer true == "true" n'a aucun sens.

+0

Merci pour la réponse !! Pouvez-vous élaborer sur «vous devrez écrire un littéral de chaîne contenant le nom de la règle en tant que paramètre». Comment pouvons-nous faire cela s'il vous plait? – Praneeth

+0

Un appel de méthode comme ceci: 'x (" y ")' – laune