2016-06-11 3 views
0

文書によると、「強制はフィールドタイプではなく値型の賛成で常に」Droolsの強制は、私が試したし、それは常に真実ではない代

に失敗します。

ルール:

rule "get event field " 
when 
    m : Message(getEventField("bigDecimalB") > "7.5") 
then 
    System.out.println("hit"); 

end 

Messageクラス:

public class Message { 

    private Map<String, Object> map = new HashMap<String, Object>(); 

    public Object getEventField(String key) { 
     Object object = map.get(key); 
     if (object != null) { 
      //class=java.math.BigDecimal in my test 
      System.out.println("getEventField, fieldName=" + key + ", class=" + object.getClass().getCanonicalName()); 
     } 
     return object; 
} 

//setter and getter 
} 

とテスト:ほとんどのケースで

 String str = "{\"bigDecimalB\":10.2}"; 
     Map<String, Object> map = JSON.parseObject(str); 

     Message message = new Message(); 
     message.setMap(map); 
     kSession.insert(message); 
     kSession.fireAllRules(); 

、それは "のBigDecimal comparation" であると明らかに10.2> 7.5、それは 'ヒット'を出力します。

しかし、失敗することがあり、「ヒット」が印刷されないことがあります。

強制は成功しておらず、「文字列比較」です。再現するのは難しいです。私は完全に混乱していて、理由を知らない。

私はdrools-6.2.0-finalとalibabaのfastjson(https://github.com/alibaba/fastjson)を使用しています。

ありがとうございました。

答えて

0

あなたは、このようなメソッドの宣言がある場合:

public Object getFooField(String key) 

あなたは愚かなコンピュータプログラムは、そのメソッドの戻り値の型を考えるかもしれないと何を思うだろうか?

+0

実行時にdroolsは正確なタイプを知っていますか? – bylijinnan

+0

はい、それは遅すぎます。あなたが念頭に置いておくと、多くの可能性の間で動的な決定が必要です。 – laune

関連する問題