有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何修复DROOL中“$emp\u id:emp\u id”中声明“$emp\u id”的字段读取器不存在的DROOL错误?

我正在开发drool(drl)POC,在该POC中,我使用反射在运行时创建JavaBean。我已在配置中设置了以下属性:

KnowledgeBuilderConfiguration config = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
config.setProperty("drools.dialect.default", "mvel");

//drl sample:
package script.demo
dialect "mvel"
import Employee;
rule "Rule - 1"
    when
        $emp: Employee($emp_id: emp_id)
    then
        System.out.println("emp id: "+$emp.emp_id);
end

但我得到了以下错误:

Field Reader does not exist for declaration '$emp_id' in '$emp_id: emp_id' in the rule 'Rule - 1' : [Rule name='Rule - 1'] @line [I@4cb9v654...............

请求帮助,如何解决此问题


共 (1) 个答案

  1. # 1 楼答案

    错误试图说明Employee类没有可以访问的字段或方法来映射到您声明的$emp_id变量

    它查找前缀为“get”的公共方法或名为as is的公共变量

    一个类似于以下任一项的Employee类定义将解决该错误

    选项1:声明一个公共变量emp_id

    public class Employee {
      public String emp_id;
    }
    

    选项2:声明一个名为getEmp_id的公共方法

    public class Employee {
      public String getEmp_id() { return "..."; }
    }
    

    以下任一选项都将解决此问题,并允许您在规则中绑定$emp_id变量:

    Employee( $emp_id: emp_id )
    

    (当然,我建议重命名为empId,然后实现这样的变量或getEmpId方法,因为这遵循Java命名约定。当然,您仍然可以在drools $emp_id中调用声明的变量。)