2016-08-18 34 views
-1

我有一個包含44個字段的pojo類對象列表。現在我正在Java中迭代每個對象,並將它傳遞給流口水進行驗證。有什麼辦法來驗證drools中的整個列表。示例代碼是對象列表的流口水驗證

rule "RuleSerialNoContent" 
when 
    droolRecord : DroolRecordBO(flowStatus==droolRecord.FLOW_PASS, 
           serialNo.trim() not matches "^\\d{1,10}$") 
then 
    droolRecord.setRuleStatus(droolRecord.SERIAL_CONTENT_ERR+ 
           " "+droolRecord.getSerialNo()); 
    droolRecord.setFlowStatus(droolRecord.FLOW_ERROR); 
    update(droolRecord); 
end 


rule "RuleInstitutionIdLength" 
when 
    droolRecord : DroolRecordBO(flowStatus==droolRecord.FLOW_PASS, 
           institutionId.length() != 6) 
then 
    droolRecord.setRuleStatus(droolRecord.INSTITUTIONID_LENGTH_ERR); 
    droolRecord.setFlowStatus(droolRecord.FLOW_ERROR); 
    update(droolRecord); 
end 

回答

0

這是可能的。插入List<DroolRecordBO>並添加「從」條款的所有規則:

rule "RuleSerialNoContent" 
when 
$list: List() 
droolRecord : DroolRecordBO(flowStatus==droolRecord.FLOW_PASS, 
          serialNo.trim() not matches "^\\d{1,10}$") 
       from $list 
then... 

可以省略更新,因爲列表中的元素不會事實了。

但是,請注意:您可能擁有的某些規則組合無法針對此微妙更改的場景進行調整。

0

可以在對象列表上執行操作。好處是你不必爲每個對象承擔編譯時間的痛苦,而只需要編譯一次。

public static KnowledgeBase getKBase(String filePath) { 

    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 
    kbuilder.add(ResourceFactory.newFileResource(filePath), ResourceType.DRL); 
    KnowledgeBase kbase = kbuilder.newKnowledgeBase(); 
    kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); 
} 

public static void main(String args[]) { 

    Collection<DroolRecordBO> droolRecordBOs = // Collection of DroolRecordBO 
    KnowledgeBase kbase = getKBase(".drl File Path"); 
    StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); 

    for(DroolRecordBO droolRecordBO : droolRecordBOs) { 
     ksession.insert(droolRecordBO); 
    } 
    ksession.fireAllRules(); 
    ksession.dispose(); 
} 

如果你想在一個特定的順序執行的規則,你可能需要考慮使用salience