Java 用于在arraylist中注入对象的循环迭代在Drools中不起作用

Java 用于在arraylist中注入对象的循环迭代在Drools中不起作用,java,spring-boot,java-8,drools,Java,Spring Boot,Java 8,Drools,我使用的是Spring Boot 2.1.6.RELEASE和drools 7.28.0.Final版 我们有两个模型类,我试图在上面使用DRL文件执行规则 模型类 public class VendorReferences { private String vendorCode; private String vendorName; private boolean isChecked; private boolean isEnabled; //get

我使用的是Spring Boot 2.1.6.RELEASE和drools 7.28.0.Final版

我们有两个模型类,我试图在上面使用DRL文件执行规则

模型类

public class VendorReferences {

    private String vendorCode;
    private String vendorName;
    private boolean isChecked;
    private boolean isEnabled;

    //gettters setters defult contructor and parametrized constructor for all args

}

public class Vendor {

    private String vendorCode;
    private String vendorName;
    private boolean isChecked;
    private boolean isEnabled;
    //other additional attributes
}

public class SubmissionObject {
    private String product;
}
Kie容器配置类

@Configuration
public class RulesConfig {

    @Bean
    public KieContainer kieContainer() {
        KieServices kieServices = KieServices.Factory.get();
        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
        kieFileSystem.write(ResourceFactory.newClassPathResource(DRL_FILE));
        KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
        kieBuilder.buildAll();
        KieModule kieModule = kieBuilder.getKieModule();

        return kieServices.newKieContainer(kieModule.getReleaseId());
    }
}
DRL文件

//model classes imports
import java.util.ArrayList;
import java.util.Iterator;
import java.util.stream.Collectors;
global  java.util.ArrayList vendorList;
global  java.util.ArrayList lstDistributionVendor;

dialect  "mvel"

rule "Product Rule"
no-loop true
    when
        $submissionObject: SubmissionObject(product!= null);
    then
        for(VendorReferences vendorRef:lstDistributionVendor){
            VendorReferences vendorObj=new VendorReferences();
            vendorObj.setVendorCode(vendorRef.getVendorCode());
            vendorObj.setChecked(vendorRef.isChecked());
            vendorList.add(vendorObj);
        }
    end
在上面的DRL文件中,我尝试迭代arraylist以设置VendorReferences对象的有限属性,然后尝试添加arraylist

public List<VendorReferences> applicableVendors(SubmissionObject submissionObject) {
        KieSession kieSession = kieContainer.newKieSession();
        ArrayList<VendorReferences> vendorList = new ArrayList<>();
        kieSession.setGlobal("vendorList", vendorList);
        kieSession.setGlobal("lstDistributionVendor", lstDistributionVendor);
        kieSession.insert(submissionObject);
        kieSession.fireAllRules();
        kieSession.dispose();
        return vendorList;
}
我无法理解为什么drools试图查看一些不同的类DefaultKnowledgeHelper来检查方法而不是模型类


如何解决上述错误?

我获取了您的所有代码并创建了一个测试。测试为我通过并成功执行,然后阻止。我使用的是完全相同的drools版本

我发现了与RedHat类似的报告。我可以看到引发异常的代码是mvel优化器

at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:1079)
at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:1071)
at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:987)
我建议如下

  • 检查您是否无意中使用了drools,即maven中的mvel2:2.4.4.Final
  • 设法
  • 为什么您试图在没有自动完成、验证的情况下在文本文件中编写java代码?。。帮个忙,用静态方法创建一个类,每个静态方法包含各自的规则,然后用方法阻塞或spring服务,获取处理所需的所有参数,如果需要与会话交互,甚至drools对象
示例drl

rule "Product Rule"
no-loop true
when
    $submissionObject: SubmissionObject(product!= null)
then
    MyRules.onProductRule(vendorList, lstDistributionVendor);
示例类

public class MyRules {
    public static void onProductRule(ArrayList vendorList, ArrayList lstDistributionVendor) {
        for(VendorReferences vendorRef:lstDistributionVendor){
            VendorReferences vendorObj=new VendorReferences();
            vendorObj.setVendorCode(vendorRef.getVendorCode());
            vendorObj.setChecked(vendorRef.isChecked());
            vendorList.add(vendorObj);
        }
    }

    public static void onOtherRule(SubmissionObject submissionObject, org.drools.core.spi.KnowledgeHelper drools) {
        drools.insert("blah");
    }
}

@感谢Adamovych提供的详细信息。但是我对口水还不熟悉,所以我可能需要一些指针来指示前2个点。如何识别drools的版本是否被覆盖,以及如何在drools中禁用优化器。我已经编辑了这个问题,添加了用于配置容器的配置类。我希望基于此,如果你能给我更多关于前2点的建议。添加了一些链接,如果您将一小段代码与test@Adamovych我试图通过传递JVM参数-Ddrools.jittingThreshold=-1来禁用优化器,并使用eclipse依赖关系树验证了mvl版本2.4.4.Final。但当我试图执行程序时,同样的问题也出现了。我要求你用一些例子来解释你的最后一点example@Adamovych:我们发现了问题,这是我的错误,因为我正在迭代包含DistributionVendor对象而不是VendorReferences对象的LSTDributionVendor。DistributionVendor没有name,isChecked属性,因此引发了错误。谢谢你的帮助。
public class MyRules {
    public static void onProductRule(ArrayList vendorList, ArrayList lstDistributionVendor) {
        for(VendorReferences vendorRef:lstDistributionVendor){
            VendorReferences vendorObj=new VendorReferences();
            vendorObj.setVendorCode(vendorRef.getVendorCode());
            vendorObj.setChecked(vendorRef.isChecked());
            vendorList.add(vendorObj);
        }
    }

    public static void onOtherRule(SubmissionObject submissionObject, org.drools.core.spi.KnowledgeHelper drools) {
        drools.insert("blah");
    }
}