我不明白为什么在 drools 规则中会产生错误
I don't understand why error is generated in drools rule
我是流口水的初学者。
我有两种类似的代码。
第一个代码正在查找。但是第二个代码不起作用。
我不明白为什么这段代码不同。
请检查此问题。
规则文件 - 正在查找
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
错误
Caused by: org.mvel2.PropertyAccessException: [Error: unable to resolve method: org.drools.core.base.DefaultKnowledgeHelper.eachErrorCd() [arglength=0]]
[Near : {... rCd[i] = new String(eachErrorCd.sErrCd); ....}]
^
ErrorCD_Intl Class
public class ErrorCD_Intl {
public String sErrCd;
public String sErrLevelDivCd;
public int iErrPriority;
public String sOldErrCd;
}
这是MVEL语言的缺点。它通过允许您编写 eachErrorCd.sErrCd
来简化 property navigation 但它期望 class 实际上有一个 getter 字段方法 (getSErrCd()
).
In situations where the field in the object is public, MVEL will still prefer to access the property via its getter method.
您的 class 中显然缺少 getter 方法,因此表达式失败。我承认,错误消息无助于确定原因。
您有两种解决问题的方法:
- 添加getter方法。它的名字应该是
getSErrCd()
.
切换到 java
方言。在这种情况下,您必须将泛型类型参数添加到 ArrayList
:
ArrayList<ErrorCD_Intl> ltErrorCd = new ArrayList<>();
P.S。我不明白为什么如果你在 for-loop.
之外做同样的事情就不会发生错误
我是流口水的初学者。 我有两种类似的代码。
第一个代码正在查找。但是第二个代码不起作用。
我不明白为什么这段代码不同。
请检查此问题。
规则文件 - 正在查找
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
错误
Caused by: org.mvel2.PropertyAccessException: [Error: unable to resolve method: org.drools.core.base.DefaultKnowledgeHelper.eachErrorCd() [arglength=0]]
[Near : {... rCd[i] = new String(eachErrorCd.sErrCd); ....}]
^
ErrorCD_Intl Class
public class ErrorCD_Intl {
public String sErrCd;
public String sErrLevelDivCd;
public int iErrPriority;
public String sOldErrCd;
}
这是MVEL语言的缺点。它通过允许您编写 eachErrorCd.sErrCd
来简化 property navigation 但它期望 class 实际上有一个 getter 字段方法 (getSErrCd()
).
In situations where the field in the object is public, MVEL will still prefer to access the property via its getter method.
您的 class 中显然缺少 getter 方法,因此表达式失败。我承认,错误消息无助于确定原因。
您有两种解决问题的方法:
- 添加getter方法。它的名字应该是
getSErrCd()
. 切换到
java
方言。在这种情况下,您必须将泛型类型参数添加到ArrayList
:ArrayList<ErrorCD_Intl> ltErrorCd = new ArrayList<>();
P.S。我不明白为什么如果你在 for-loop.
之外做同样的事情就不会发生错误