Drools 规则语言:class 字段的奇怪行为
Drools rule language: strange behaviour with class fields
我最近注意到 drools 规则有一些奇怪的行为。我有 class HeartRate,它有以下字段:
int heartRate;
Date timeStamp;
String macAddress;
我的规则文件如下:
import drools.HeartRate
import drools.Action
declare HeartRate
@role(event)
end
rule "HEARTRATE RULE 1"
when
$heartRate : HeartRate(heartRate >= 180) from entry-point "entryHeartRate"
then
Action.handleAction(1,"Heart rate is to high!");
end
我想将字段 heartRate
更改为 heartrate
并且我还更改了我的规则中的字段名称,这样我的新规则现在是:
rule "HEARTRATE RULE 1"
when
$heartRate : HeartRate(heartrate >= 180) from entry-point "entryHeartRate"
then
Action.handleAction(1,"Heart rate is to high!");
end
但这会产生错误,即 drools 无法解析字段 heartrate
。但是,当我将规则改回原来的规则时,使用 heartRate
它会起作用,尽管这样的字段不再存在。我收到以下错误:
[Unable to Analyse Expression heartrate >= 180:
[Error: unable to resolve method using strict-mode: drools.HeartRate.heartrate()]
Exception in thread "main" java.lang.RuntimeException: Unable to compile drl".
[Near : {... heartrate >= 180 ....}]
^
[Line: 26, Column: 4] : [Rule name='HEARTRATE RULE 1']
]
at drools.Main.initDrools(Main.java:53)
at drools.Main.main(Main.java:39)
C:\Users\Tim Deweert\AppData\Local\NetBeans\Cache.1\executor-snippets\run.xml:53: Java returned: 1
我发现我的错误,我忘记更改字段心率的get/set方法。
您的 类 应该遵循 Java Beans 规范,如果您在约束中使用 someField
,Drools 将尝试定位 getSomeField
。 private 实例字段本身的调用方式并不重要。
如果字段是public,如果名字匹配就会使用。否则,如果其名称根据上面给出的规则匹配,则使用 getter。
我最近注意到 drools 规则有一些奇怪的行为。我有 class HeartRate,它有以下字段:
int heartRate;
Date timeStamp;
String macAddress;
我的规则文件如下:
import drools.HeartRate
import drools.Action
declare HeartRate
@role(event)
end
rule "HEARTRATE RULE 1"
when
$heartRate : HeartRate(heartRate >= 180) from entry-point "entryHeartRate"
then
Action.handleAction(1,"Heart rate is to high!");
end
我想将字段 heartRate
更改为 heartrate
并且我还更改了我的规则中的字段名称,这样我的新规则现在是:
rule "HEARTRATE RULE 1"
when
$heartRate : HeartRate(heartrate >= 180) from entry-point "entryHeartRate"
then
Action.handleAction(1,"Heart rate is to high!");
end
但这会产生错误,即 drools 无法解析字段 heartrate
。但是,当我将规则改回原来的规则时,使用 heartRate
它会起作用,尽管这样的字段不再存在。我收到以下错误:
[Unable to Analyse Expression heartrate >= 180:
[Error: unable to resolve method using strict-mode: drools.HeartRate.heartrate()]
Exception in thread "main" java.lang.RuntimeException: Unable to compile drl".
[Near : {... heartrate >= 180 ....}]
^
[Line: 26, Column: 4] : [Rule name='HEARTRATE RULE 1']
]
at drools.Main.initDrools(Main.java:53)
at drools.Main.main(Main.java:39)
C:\Users\Tim Deweert\AppData\Local\NetBeans\Cache.1\executor-snippets\run.xml:53: Java returned: 1
我发现我的错误,我忘记更改字段心率的get/set方法。
您的 类 应该遵循 Java Beans 规范,如果您在约束中使用 someField
,Drools 将尝试定位 getSomeField
。 private 实例字段本身的调用方式并不重要。
如果字段是public,如果名字匹配就会使用。否则,如果其名称根据上面给出的规则匹配,则使用 getter。