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。
传SF 4.0和4.1。显示,请问,关于此事的例外 – 2014-09-04 11:49:33
我没有得到一个异常,它似乎在引擎盖'新的BigDecimal(“119000000000.000000”)'值被转换为一个数字,然后'intValue()'被称为apon它。 intValue()返回'-1259084288'的值。如果将BigDecimal值除以100,000,则该值将下降到int的有效范围内,以便表达式通过。 – emeraldjava 2014-09-04 12:38:44