如何修复 DROOL 错误“Field Reader does not exist for declaration '$emp_id' in '$emp_id : emp_id' in drool?

How to fix the DROOL error "Field Reader does not exist for declaration '$emp_id' in '$emp_id : emp_id' in drool?

我正在开发一个 drool(drl) POC,我在其中使用反射在 运行 时间创建了 java 个 bean。我在配置中设置了以下 属性:

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...............

请求帮助,如何解决?

该错误试图说明您的员工 class 没有可以访问以映射到您已声明的 $emp_id 变量的字段或方法。

它查找以 'get' 为前缀的 public 方法,或原样命名的 public 变量。

类似于以下任一内容的 Employee class 定义将解决错误。

选项 1:声明一个 public 变量 emp_id

public class Employee {
  public String emp_id;
}

选项 2:声明一个名为 getEmp_id 的 public 方法。

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

这些选项中的任何一个都可以解决问题并允许您在规则中绑定 $emp_id 变量:

Employee( $emp_id: emp_id )

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