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>

我使用 XPath 获取 XML 值并将其转换为按<valueType>元素值浮动...

不,我确实value="0"也被转换为浮动。

现在,我必须应用已指定为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网站的代码示例:

    // 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>);

在我看来,这是最具可扩展性的解决方案,因为它允许您在一行代码中构建复杂的验证表达式。

于 2012-04-18T11:25:01.577 回答
0

将原始值包装到相应的包装器中:

Float f = new Float(floatValue)

然后您可以compareTo()多态地使用提供的方法。

编辑:您还可以查看表达式解析的全功能实现;除了这里已经提到的其他内容,我会添加Spring EL

于 2012-04-18T11:15:15.293 回答