2012-03-19 11 views
2

フィールドの最大長などのメタデータを含むXMLファイルがあります。私は事実のリストに対してこのメ​​タデータを検証するためのルールを構築するためにdroolsを使用しなければなりません。私はXMLで指定されていてもいなくてもよい各フィールドの名前をハードコードしたくありません。どうやってドループの動的プロパティを取得できますか

私はこれを実行しようとしました:

when 
    $metadata: Metadata(maxLength != null); 
    $obj: Object(eval($metadata.getFieldName()).length > $metadata.maxLength); 
then 
    // TODO 
end 

それが機能しないと、私は次のエラーを取得する:

java.lang.IllegalStateException: Errors while building rules : Unable 
to Analyse Expression $metadata.getFieldName() > $metadata.maxLength: 
[Error: Comparison operation requires compatible types. Found class 
java.lang.String and class java.lang.Integer] [Near : {... 
$metadata.getFieldName() > $metadata.maxLength ....}] 

は、それが動的にフィールド名を取得し、その最大の長さを比較することは可能ですか?これを達成するためにJavaオブジェクトを作成する必要がありますか?

ありがとうございました

答えて

0

最後に、ルールテンプレートを使用してXMLから動的にdroolsファイルを生成することにしました。

0

あなたはXMLとメタデータを話します。すべてのエンティティを区別できますか?たとえば、注文に関するものであれば、各注文と各注文の属性を抽出できますか?

私はマップを使用して同様の問題を解決し、各属性を格納しました。

public class Order{ 
    private int id; 
    private Map<String, Integer> num_attribute_map = new HashMap<String, Integer>(); 
    public Map getNumAttributeMap(){ 
      return this.num_attribute_map; 
    } 

注文は= 5 customer_satisfaction

order_obj.getNumAttributeMap().put("customer_satisfaction" , 5); 

を有し、したがって、あなたはnumAttributeMapに保存されているそれらの属性を持つOrder Sを作成した場合。もちろん$attribute"customer_satisfaction"だろうOrder

$ord : Order(
      getNumAttributeMap[$attribute] >= $value 
     ) 

上のルールを実装するために


[]記法は、指定されたキーのインデックスまたはマップの値が与えられたリストの要素にアクセスするために使用されます。


あなたはマップの概念を "欲しい"と思っています。また、リストとマップへのアクセスのためのDrools言語のサポートを参照してください。

私は、文字列のリストのマップを実装して、比較演算を行う整数のマップに加えて、 "in in"演算を実行しました。 https://stackoverflow.com/a/9241089/604511も参照してください

+0

ありがとう、私はマップソリューションを念頭に置いておきますが、残念ながら、私には必要なものが正確には与えられません。 – Francis

関連する問題