2016-04-11 7 views
0

Ich habe eine einfache Regel, in der ich zwei String-Typ der Variable in Sitzung einfügen. Jetzt muss ich Variablen holen.Drools holen die gleiche Art von Objekt aus der Sitzung

Code für gleiche:

rule "Header Account Null Check" 
    dialect "java" 
    ruleflow-group "TB:Header Account Null Check" 
    when 
     cAccount : AccountPair(headerAccount == null)  
    then 
     String error=new String(); 
     String validateMsg=new String(); 
     error="2528"; 
     validationMsg="Header Account must not be null" 
     modify(cAccount) { 
       setErrorCode("2528") 
     } 
     insert(error); 
     insert(validateMsg); 
     System.out.println("Header Account null check called"); 
end 

query "fetch validation variables" 
    #conditions 
    s:String(); 
end 

Java-Code:

Collection<Object> myfacts = kSession.getObjects(new ClassObjectFilter(String.class)); 

Nachdem in myfacts Kontrolle bekam ich zwei Werte.

Jetzt ist das Problem gibt es zwei Variablen mit String.class Typ sind, muss ich für Fehler, welcher Wert wissen ist, und welcher Wert für validationMsg so, dass wir nächste Aufgabe durchführen wird.

Gleich mit Input auch wenn wir jetzt zwei String-Variablen aus Session hinzufügen, muss ich Bedingung für diese Variable hinzufügen. Das gleiche Problem tritt auch bei same auf. Bis jetzt haben wir das Problem der Eingabevariablen gelöst, indem wir die Variable als Globale Variable deklariert haben. Ich muss diese Strategie auch ändern, weil es keine gute Entscheidung ist, globale Variable zu deklarieren.

Bitte helfen Sie mir.

Antwort

1

Dies sollte ziemlich offensichtlich sein: Wenn Sie mehrere String-Objekte haben, können Sie nicht unterscheiden, wenn ihre Werte bestimmte Eigenschaften haben. (In Ihrem Fall ist die Fehlerzeichenfolge numerisch und die andere nicht.) Es wird jedoch nicht empfohlen, eine App darauf aufzubauen.

Sie müssen also eine Kennung an den String-Wert anhängen. Dazu können Sie ein Objekt erstellen, das eine String name und eine String value enthält. Und Ihr RHS wird:

insert(new Result("error", "2528")); 
    insert(new Result("message", "Header Account must not be null")); 
    modify(cAccount) { 
     setErrorCode("2528") 
    } 
    System.out.println("Header Account null check called"); 

Sie können das gleiche Prinzip für mehrere Eingänge verwenden.

+0

Danke, ich kenne diesen Ansatz, Szenario ist ein großes System mit JRule, wir konvertieren in Drools, JRule hat eine Möglichkeit, Eingabe-und Ausgabeparameter zu setzen. Ich brauche über die Möglichkeit, weil wir nicht wollen, den Code von Java prospektiv zu ändern. – Viral

+0

Nun, wenn Sie das alles wissen: Was bringt es, diese Frage zu stellen? – laune

+0

weil ich wissen möchte, ob es einen Weg gibt, keine Wrapperklasse zu erstellen, aber Variablenwerte abrufen kann und in der Lage bin, den Wert dieser Variablen zu identifizieren. – Viral