2017-01-04 9 views
0

最新のdrools 6.5バージョンでdrools 5.3を使用していたアプリケーションを移行しています。ここに私の実際の抽出物である:Drools条件でEnumキーでマップからオブジェクトを取得できません

public class Convention { 
    [...] 
    private Map<ECommissionType, List<Commission>> commissions = new HashMap<>(); 
    [...] 
} 

と非常にシンプルな列挙:

public enum ECommissionType { 
    ACQ,RIS,POF,[...] 
} 

私は決定表を使用していて、条件ヘッダの一つは以下の通りです($conventionが適切であると仮定すると元の状態に初期化され、示されConventionクラス)のインスタンスである:私のルールを定義するラインで

$comm : Commission() from $convention.getCommissions().get(ECommissionType.$1) 

、私は価値のいずれかを使用しています例えば、POFまたはRISです。 Drools 5.3はこの条件をコンパイルしていますが、Drools 6.5はそうではありません。このエラーメッセージで失敗します:

Unable to Analyse Expression $convention.getCommissions().get(ECommissionType.RIS)): 
sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl cannot be cast to java.lang.Class : [Rule name='B_CommissionLigne_98'] 

このエラーを処理するための洞察はありますか?

答えて

2

あなたがCommission()を追加する必要が

$conv : Commission from $convention.getCommissions().get(ECommissionType.$1) 

を持っています。

5.3と6.0の間のパーサと式の評価の仕組みのかなりの変化が、バグを導入した可能性があります。

はい、バグです。いくつかの名前の短縮が、同じタイプを使用して、この問題を回避:

rule comms 
when 
    $conv: Convention() 
    $comm: Comm() from (ArrayList)($conv.getComms()).get(Type.AAA) 
then 

(なぜあなたはEnumMap ??を使用していない)

+0

確かに、私は2つの括弧を忘れてしまいました。私はそれらを私のポストに加えました。しかし、私は本当にあなたの答えを理解していません。私は多くのデシジョンテーブルでこの構文を使用しています。左側に単一のオブジェクトを持つ 'from'キーワードの右側に' List'があります。これは、drools 5とdrools 6の両方で動作し、リストのオブジェクトに対してアクションを適用します。私は単に、デシジョンテーブルのアクション列のリストのすべてのオブジェクトに対してメソッド(セッター)を呼び出すだけです。 – Wis

+0

ところで、私はEnumMapを見て、聞いたことはありません。 – Wis

+0

おっと、今私は混乱していました。私は何が分からないのでしょうか、多分それは欠けている括弧でした;-)私の改訂された答えを見て、私は調査します。 – laune

関連する問題