2012-03-19 60 views
2

我有一個XML文件包含像字段的最大長度的元數據。我必須使用drools來構建規則,以根據事實列表驗證此元數據。我不想硬編碼XML中可能指定或不指定的每個字段的名稱。我怎樣才能得到動態屬性在drools

我試着這樣做:

when 
    $metadata: Metadata(maxLength != null); 
    $obj: Object(eval($metadata.getFieldName()).length > $metadata.maxLength); 
then 
    // TODO 
end 

它不工作,我得到以下錯誤:

java.lang.IllegalStateException: Errors while building rules : Unable 
to Analyse Expression $metadata.getFieldName() > $metadata.maxLength: 
[Error: Comparison operation requires compatible types. Found class 
java.lang.String and class java.lang.Integer] [Near : {... 
$metadata.getFieldName() > $metadata.maxLength ....}] 

是否可以動態獲取一個字段名,並比較其最大長度是多少?我將不得不創建一個java對象來完成這個?

謝謝

回答

0

最後,我決定使用規則模板從我的XML中動態生成我的drools文件。

0

您談論XML和元數據。你能區分所有實體嗎?例如,如果是關於訂單,您是否可以提取每個訂單以及每個訂單的屬性?

我解決了使用地圖來存儲每個屬性的類似問題。

public class Order{ 
    private int id; 
    private Map<String, Integer> num_attribute_map = new HashMap<String, Integer>(); 
    public Map getNumAttributeMap(){ 
      return this.num_attribute_map; 
    } 

如果訂單customer_satisfaction = 5,

order_obj.getNumAttributeMap().put("customer_satisfaction" , 5); 

就這樣,你已經創建Order s的存儲在numAttributeMap其屬性。


有關的Order

$ord : Order(
      getNumAttributeMap[$attribute] >= $value 
     ) 

實施規則,其中$attribute"customer_satisfaction",當然。 []表示法用於訪問給定密鑰的給定索引或值的列表中的元素。


希望你 「獲得」 映射的概念。另外,請查看Drools語言支持列表和地圖訪問。

我還執行了字符串列表的映射以執行「處於」操作,此外還有執行比較操作的整數映射。請參閱https://stackoverflow.com/a/9241089/604511

+0

非常感謝,我會記住地圖解決方案,不幸的是,它並不能完全滿足我的需求。 – Francis 2012-03-21 15:00:26