2015-05-13 60 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,非常感謝!有效。 –