Java 对象列表的drool验证

Java 对象列表的drool验证,java,drools,Java,Drools,我有一个包含44个字段的pojo类对象列表。现在我在java中迭代每个对象,并将其传递给drool进行验证。有没有办法在drools中验证整个列表。示例代码是 rule "RuleSerialNoContent" when droolRecord : DroolRecordBO(flowStatus==droolRecord.FLOW_PASS, serialNo.trim() not matches "^\\d{1,10}$

我有一个包含44个字段的pojo类对象列表。现在我在java中迭代每个对象,并将其传递给drool进行验证。有没有办法在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

这是可能的。插入
列表
,并在所有规则中添加“from”子句:

rule "RuleSerialNoContent"
when
$list: List()
droolRecord : DroolRecordBO(flowStatus==droolRecord.FLOW_PASS,
                           serialNo.trim() not matches "^\\d{1,10}$" )
              from $list
then...
您可以省略更新,因为列表元素不再是事实


但是,请注意:您可能拥有的某些规则组合无法针对这种细微变化的场景进行调整。

可以对对象列表执行操作。优点是您不必为每个对象承担编译时间的痛苦,而是只需编译一次

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();
}
publicstaticknowledgebase getKBase(字符串文件路径){
KnowledgeBuilder kbuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();
添加(ResourceFactory.newFileResource(filePath)、ResourceType.DRL);
KnowledgeBase kbase=kbuilder.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
}
公共静态void main(字符串参数[]){
Collection droolRecordBOs=//DroolRecordBO的集合
KnowledgeBase kbase=getKBase(“.drl文件路径”);
StatefulKnowledgeSession ksession=kbase.newStatefulKnowledgeSession();
for(DroolRecordBO DroolRecordBO:droolRecordBOs){
K会话插入(droolRecordBO);
}
ksession.fireAllRules();
ksession.dispose();
}

如果您希望按特定的顺序执行规则,您可能需要考虑使用<代码>显著性