2014-09-04 500 views
1

我们使用Spring Expression Language(v3.1.2)来验证地图中的Object值。下面的两个测试用例概述了我们断言BigDecimal对象的值的场景。第一个案例通过但第二个测试失败。我认为我们定义表达式的方式是更正,但怀疑实现不能正确地转换对象值。Spring SpEL和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); 
} 

是否有任何推荐的方法可以在currect版本上完成此操作。我可以将额外信息 传递给StandardEvaluationContext对象吗?

编辑1

我写这个测试显示的BigDecimal值是如何转换为“廉政”和“长”

@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。

+0

传SF 4.0和4.1。显示,请问,关于此事的例外 – 2014-09-04 11:49:33

+0

我没有得到一个异常,它似乎在引擎盖'新的BigDecimal(“119000000000.000000”)'值被转换为一个数字,然后'intValue()'被称为apon它。 intValue()返回'-1259084288'的值。如果将BigDecimal值除以100,000,则该值将下降到int的有效范围内,以便表达式通过。 – emeraldjava 2014-09-04 12:38:44

回答