Spring SpEL和BigDecimal表达式

时间:2014-09-04 09:46:00

标签: spring-el

我们使用Spring Expression Language(v3.1.2)来验证地图中的Object值。下面的两个测试用例概述了我们断言BigDecimal对象的值的场景。第一种情况通过,但第二次测试失败。我认为我们定义表达式的方式是修正,但是怀疑实现没有正确地转换对象值。

@Test
public void testBigDecimalValueLess() { 

    Map<String,Object> map = new HashMap<String,Object>();
    map.put("premiums",new BigDecimal("400000.000000"));

    StandardEvaluationContext stdContext = new StandardEvaluationContext();
    stdContext.setVariables(map);

    // Set expression
    String ruleExpression = "#premiums>=new java.math.BigDecimal('500000')";
    // Evaluate the SpEL expression
    ExpressionParser parser = new SpelExpressionParser();

    Expression expression = parser.parseExpression(ruleExpression);
    Boolean returnValue = expression.getValue(stdContext,Boolean.class);
    Assert.assertEquals(Boolean.FALSE,returnValue);
}

@Test
public void testBigDecimalValueGreater() { 

    Map<String,Object> map = new HashMap<String,Object>();
    map.put("premiums",new BigDecimal("119000000000.000000"));

    StandardEvaluationContext stdContext = new StandardEvaluationContext();
    stdContext.setVariables(map);

    // Set expression
    String ruleExpression = "#premiums>=new java.math.BigDecimal('500000')";
    // Evaluate the SpEL expression
    ExpressionParser parser = new SpelExpressionParser();

    Expression expression = parser.parseExpression(ruleExpression);
    Boolean returnValue = expression.getValue(stdContext,Boolean.class);
    Assert.assertEquals(Boolean.TRUE,returnValue);
}

是否有任何推荐的方法可以在当前版本上实现此目的。我可以传递额外的信息吗? 到StandardEvaluationContext对象?

编辑1

我编写了这个测试来展示如何将BigDecimal值强制转换为&#39; int&#39;和&#39;长&#39;

@Test
public void bigDecimalIntValue(){
    System.out.println(new BigDecimal("1000").intValue());
    System.out.println(new BigDecimal("100000").intValue());
    System.out.println(new BigDecimal("10000000").intValue());
    System.out.println(new BigDecimal("1000000000").intValue());
    System.out.println(new BigDecimal("100000000000").intValue()); --> 1215752192
    System.out.println(new BigDecimal("100000000000").longValue()); --> 100000000000
    System.out.println(new BigDecimal("713027290000.000000").intValue()); --> 62718864
    System.out.println(new BigDecimal("713027290000.000000").longValue()); --> 713027290000
}

我怀疑我只需要确保我的表达式在评估操作之前将两个数字都转换为Long。

1 个答案:

答案 0 :(得分:1)

我建议使用BigDecimal类的compareTo(BigDecimal val)方法。有关此方法的详细信息,请查看http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#compareTo%28java.math.BigDecimal%29并将表达式更改为以下内容:

String ruleExpression = "#premiums.compareTo(new java.math.BigDecimal('500000')) >= 0";