0

私は最近、drools ルールの奇妙な動作に気付きました。クラス 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

しかし、これによりエラーが発生します。つまり、よだれがフィールドを解決できないというエラーが発生します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\8.1\executor-snippets\run.xml:53: Java returned: 1
4

2 に答える 2

2

クラスは Java Beans 仕様に準拠する必要があり、Drools は制約でgetSomeField使用するかどうかを特定しようとします。プライベートインスタンス フィールド自体がsomeFieldどのように呼び出されるかは問題ではありません。

フィールドが public の場合、名前が一致すると使用されます。それ以外の場合、上記のルールに従って名前が一致する場合、getter が使用されます。

于 2016-04-22T10:46:33.960 に答える