2016-04-11 37 views
0

我有简单的规则,其中我在Session中插入了两个String类型的变量。现在我需要获取变量。Drools从会话中获取同一类型的对象

代码对于相同:

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代码:

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

myfacts检查后,我得到了两个值。

现在的问题是有两个变量与String.class类型,我需要知道哪些值是错误和值是validationMsg,使我们将执行下一个任务。

与输入相同,如果我们从Session中添加两个字符串变量,现在我需要在这些变量上添加条件。所以也出现同样的问题。现在我们通过将变量声明为全局变量来解决输入变量问题。我也需要改变这个策略,因为它不是一个宣布全局变量的好决定。

请帮我一把。

回答

1

这应该很明显:如果你有多个String对象,除非它们的值具有某些特征,否则你不能区分。 (在你的情况下,错误字符串是数字,而另一个不是。)但不建议在此基础上的应用程序。

所以你必须附加一个标识字符串值。为此,您可以创建一个包含String nameString value的对象。并且您的RHS变为:

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"); 

您可以对多个输入使用相同的原理。

+0

谢谢,我知道这种方法,场景是我们用JRule有大型系统,我们正在转换成Drools,JRule有一个设置输入和输出参数的工具。我需要上面的设施,因为我们不想从Java更改代码。 – Viral

+0

那么,如果你知道所有这些:问这个问题有什么意义? – laune

+0

,因为想知道是否存在不创建包装类的方法,但能够获取变量值并能够识别哪个变量的值。 – Viral