Drools 6.2如何在声明的类型中使用ArrayList?

时间:2015-05-13 16:33:43

标签: collections types drools rules declare

以下是我在DLR文件中的内容:

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转换为使用FactType的Person类型的ojbect。见下文:

    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并使其仍然有效?

1 个答案:

答案 0 :(得分:0)

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

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

在这种情况下,Gson应该正确选择类型并且规则将会触发。