2016-04-21 19 views
0

Ich habe vor kurzem ein seltsames Verhalten mit drools Regeln bemerkt. Ich hatte Klasse Herzfrequenz und es hat folgende Felder:Drools Regelsprache: seltsames Verhalten mit Klassenfeldern

int heartRate; 
Date timeStamp; 
String macAddress; 

Meine Regeldatei ist die folgende:

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 

Ich mag das Feld heartRate-heartrate ändern und ich die Feldnamen in meiner Regel ändern auch so, dass meine neue Regel ist jetzt:

rule "HEARTRATE RULE 1" 
when 
    $heartRate : HeartRate(heartrate >= 180) from entry-point "entryHeartRate" 
then 
    Action.handleAction(1,"Heart rate is to high!"); 
end 

Aber dies gibt Fehler nämlich, dass das Feld heartrate nicht auflösen kann sabbert. Aber wenn ich die Regel wieder auf das Original zurückstelle, so funktioniert das mit heartRate Event obwohl ein solches Feld nicht mehr existiert. Ich bekomme den folgenden Fehler:

[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 

Antwort

1

Ihre Klassen sollten der Java Beans-Spezifikation entsprechen und Drools versuchen, getSomeField zu finden, wenn Sie someField in einer Einschränkung verwenden. Es spielt keine Rolle, wie das private Instanzfeld selbst aufgerufen wird.

Wenn das Feld öffentlich ist, wird es verwendet, wenn der Name übereinstimmt. Andernfalls wird ein Getter verwendet, wenn sein Name gemäß der oben angegebenen Regel übereinstimmt.

0

Ich fand meinen Fehler, ich habe vergessen, die Get/Set-Methoden des Feldes Herzfrequenz zu ändern.