我不知道';无法理解drools规则中生成错误的原因

我不知道';无法理解drools规则中生成错误的原因,drools,Drools,我是流口水的初学者。 我有两种类似的代码 第一个代码是工作查找。但第二个代码不起作用 我不明白为什么这个代码不同 请检查这个问题 规则文件-工作查找 rule "VoLTE Validate Rule" dialect "mvel" when $uBody : VoLTEBody() then ArrayList ltErrorCd = new ArrayList(); ErrorCD_Intl uErrCdOut = new ErrorCD_In

我是流口水的初学者。 我有两种类似的代码

第一个代码是工作查找。但第二个代码不起作用

我不明白为什么这个代码不同

请检查这个问题

规则文件-工作查找

 rule "VoLTE Validate Rule"
 dialect "mvel"
 when
      $uBody : VoLTEBody()
 then
       ArrayList ltErrorCd = new ArrayList();
       ErrorCD_Intl uErrCdOut = new ErrorCD_Intl("0001", "10", 1, "IMSI");
       ltErrorCd.add(uErrCdOut);

       String[] ltErrCd = new String[5];
       ErrorCD_Intl eachErrorCd = ltErrorCd.get(0);
       ltErrCd[0] = new String(eachErrorCd.sErrCd);
 end
规则文件-不工作

  rule "VoLTE Validate Rule"
  dialect "mvel"
  when
       $uBody : VoLTEBody()
  then
       ArrayList ltErrorCd = new ArrayList();
       ErrorCD_Intl uErrCdOut = new ErrorCD_Intl("0001", "10", 1, "IMSI");
       ltErrorCd.add(uErrCdOut);

       String[] ltErrCd = new String[5];
       for (int i=0; i<ltErrorCd.size(); i++) {
            ErrorCd_Intl eachErrorCd = ltErrorCd.get(i);
            ltErrCd[i] = new String(eachErrorCd.sErrCd);
       }
   end
错误CD_国际等级

 public class ErrorCD_Intl {
        public String sErrCd;
        public String sErrLevelDivCd;
        public int    iErrPriority;
        public String sOldErrCd;

 }

这是MVEL语言的一个缺点。它通过允许您编写
eachErrorCd.sErrCd
来简化,但它希望类实际具有字段的getter方法(
getSErrCd()

在对象中的字段为公共字段的情况下,MVEL仍然希望通过其getter方法访问该属性

类中显然缺少getter方法,因此表达式失败。我承认,错误信息无助于确定原因

您有两个选项来解决此问题:

  • 添加getter方法。它的名称可能应该是
    getSErrCd()
  • 切换到
    java
    方言。在这种情况下,您必须将泛型类型参数添加到
    ArrayList

    ArrayList<ErrorCD_Intl> ltErrorCd = new ArrayList<>();
    
    ArrayList ltErrorCd=new ArrayList();
    

  • 另外,如果在for循环之外执行相同的操作,我不理解为什么不会发生错误。

    这是MVEL语言的一个缺点。它通过允许您编写
    eachErrorCd.sErrCd
    来简化,但它希望类实际具有字段的getter方法(
    getSErrCd()

    在对象中的字段为公共字段的情况下,MVEL仍然希望通过其getter方法访问该属性

    类中显然缺少getter方法,因此表达式失败。我承认,错误信息无助于确定原因

    您有两个选项来解决此问题:

  • 添加getter方法。它的名称可能应该是
    getSErrCd()
  • 切换到
    java
    方言。在这种情况下,您必须将泛型类型参数添加到
    ArrayList

    ArrayList<ErrorCD_Intl> ltErrorCd = new ArrayList<>();
    
    ArrayList ltErrorCd=new ArrayList();
    

  • 另外,如果您在for循环之外执行相同的操作,我不理解为什么不会发生错误。

    谢谢您的评论。我将尝试修改我的源代码。我认为这实际上是MVEL中的一个bug。“preference”意味着如果有getter,它将使用getter,但是如果没有getter,它不应该失败。至少没有for循环的行为表明了这一点。我将提出一个问题。谢谢你的评论。我将尝试修改我的源代码。我认为这实际上是MVEL中的一个bug。“preference”意味着如果有getter,它将使用getter,但是如果没有getter,它不应该失败。至少没有for循环的行为表明了这一点。我将提出一个问题。