2015-05-13 24 views
1

以下是我在我的DLR文件:Drools 6.2如何在声明的类型中使用ArrayList?

package mytypes; 

declare Person 
    firstName : String 
    lastName : String  
    address : java.util.ArrayList 
end 

declare Address 
    city : String 
    state : String 
end 

rule "city" 
when 
p : Person() 
Address(city == "Dallas") from p.address 
then 
System.out.println("city rule fired"); 
end 

我用GSON我的JSON转换为ojbect使用FactType类型的人。见下图:

FactType ft = base.getFactType("mytypes","Person"); 
    Object oPerson = ft.newInstance();  
    Gson gConverter = new Gson(); 
    Object input = gConverter.fromJson(fact, oPerson.getClass()); 

这里是我的JSON:

{"firstName":"John","lastName":"Smith","address":[{"city":"Dallas","state":"TX"}]} 

我得到的对象返回。这是它的外观在内存:

Person(firstName=John, lastName=Smith, address=[{city=Irving, state=TX}]) 

我的规则不被解雇,因为你可以看到有没有地址地址内部集合。有谁知道如何使它工作?另外,如果我不使用json来获取Person对象,并且使用“getFactType”手动构建它,并使用“set”来设置属性,那么我能够让我的规则被解雇。这是我如何手动构建它

FactType ftPerson = base.getFactType("mytypes","Person"); 
    Object oPerson = ft.newInstance(); 
    ArrayList al = new ArrayList(); 
    FactType ftAddress = base.getFactType("mytypes","Address"); 
    Object add = ftAddress.newInstance(); 
    ftAddress.set(add, "city", "Dallas"); 
    ftAddress.set(add, "state", "TX"); 
    al.add(add); 
    ftPerson.set(oPerson, "address", al); 

这是Person对象的外观在内存中,并注意地址类型是如何在地址指定集合:

Person(firstName=null, lastName=null, address=[Address(city=Irving, state=TX)]) 

我希望我已经解释了完整的场景。我如何仍然可以使用json并使其继续工作?

回答

0

由于ArrayList是一个通用集合,当处理JSON字符串时,Gson无法正确识别地址对象的类型。最简单的方法来完成你正在尝试做的是使用,而不是一个ArrayList的数组:

declare Person 
    firstName : String 
    lastName : String  
    address : Address[] 
end 

在这种情况下,GSON应该正确地拿起类型和规则将触发。

+0

krautmeyer,非常感谢!有效。 –