6

友達、

検証のためのフレームワークを作成しています...

以下のような設定ファイルがあります...

<root>
<property name="Premium">
    <xmlTag>//Message/Request/Product/Benefit/Premium/amount</xmlTag>
    <valueType>float</valueType>
    <validation condition=">" value="0">Premium Amount cannot be less than Zero.</validation>
</property>

<valueType>XPath を使用して XML 値を取得し、要素値で float に変換します...

いいえ、私value="0"も float に変換されています。

ここで、 として指定された条件を適用する必要がありますcondition=">"

IF ELSEIF....ELSE ループでこれを実行したくありません。

「<」を演算子に変換し<たり、文字列で比較演算子を使用したりする他の方法はありますか?

このようにして、私のコードは単純になり、将来のより多くのオペレーターにとって便利になります。

================================================== ===========================

提案と回答をありがとう...

BeanShellの bsh.Interpreterを使用することにしました。それは私のために仕事をします...

あなたのためのサンプルコード...

        System.out.println(new bsh.Interpreter().eval("1 < 0"));
        System.out.println(new bsh.Interpreter().eval("1 > 0"));
        System.out.println(new bsh.Interpreter().eval("1 >= 0"));
        System.out.println(new bsh.Interpreter().eval("0 >= 0"));
        System.out.println(new bsh.Interpreter().eval("1 != 0"));
        System.out.println(new bsh.Interpreter().eval("0 != 0"));
        System.out.println(new bsh.Interpreter().eval("1 == 0"));
        System.out.println(new bsh.Interpreter().eval("0 == 0"));

私に真/偽を返しました。

ありがとう & 幸運を...

4

3 に答える 3

2

switchステートメントを使用できます

char operator = ...;
switch(operator) {
   case '<': return value1 < value2;
   case '=': return value1 == value2;
}
于 2012-04-18T11:15:06.720 に答える
2

統合がはるかに簡単なため、Java ELやさらに優れたApache Commons Jexlなどの式言語を使用することをお勧めします。JEXL Web サイトから取得したコード サンプルを次に示します。

    // Assuming we have a JexlEngine instance initialized in our class named 'jexl':
    // Create an expression object for our calculation
    String calculateTax = "((G1 + G2 + G3) * 0.1) + G4";
    Expression e = jexl.createExpression( calculateTax );

    // populate the context
    JexlContext context = new MapContext();
    context.set("G1", businessObject.getTotalSales());
    context.set("G2", taxManager.getTaxCredit(businessObject.getYear()));
    context.set("G3", businessObject.getIntercompanyPayments());
    context.set("G4", -taxManager.getAllowances());
    // ...

    // work it out
    Float result = (Float)e.evaluate(context);

特定の例では、検証 XML を次のように変更できます。

<property name="Premium">
    <xmlTag>//Message/Request/Product/Benefit/Premium/amount</xmlTag>
    <valueType>float</valueType>
    <validation expression="Premium> 0">Premium Amount cannot be less than Zero.</validation>
</property>

次に、独自の JEXL コンテキストを構築します。

JexlContext context = new MapContext();
context.set("PREMIUM", <Premium value fetched from XML>);

私の意見では、これは複雑な検証式をわずか 1 行のコードで作成できるため、最もスケーラブルなソリューションです。

于 2012-04-18T11:25:01.577 に答える
0

プリミティブ値を対応するラッパーにラップします。

Float f = new Float(floatValue)

compareTo()次に、提供されたメソッドを多態的に使用できます。

編集:式解析のフル機能の実装を確認することもできます。ここですでに言及した他のものに加えて、SpringELを追加します

于 2012-04-18T11:15:15.293 に答える