SpEL - 空值比较

时间:2014-10-16 13:21:27

标签: spring spring-el

我试图将spring版本从3.0.5升级到3.2.11。

当表达式像这样比较空值时,我在SpEL遇到麻烦:

new SpelExpressionParser().parseExpression("null < 7").getValue();    

以上代码的结果导致

  • false,使用版本3.0.5时
  • true,当使用版本3.2.11时,由于我的意见
  • ,这是不正确的

这种不同行为的原因是,在SpEL内部使用的StandartTypeComparator类中,有不同的比较方法实现:

  • 版本3.0.5

    public int compare(Object left, Object right) throws SpelEvaluationException {
    // If one is null, check if the other is
    if (left == null) {
        return right == null ? 0 : 1;
    } else if (right == null) {
        return -1; // left cannot be null
    }
    
  • 版本3.2.11

    public int compare(Object left, Object right) throws SpelEvaluationException {
    // If one is null, check if the other is
    if (left == null) {
        return right == null ? 0 : -1;
    } else if (right == null) {
        return 1; // left cannot be null
    }
    

当我观察上面的代码时,我可以看到正在运行

new SpelExpressionParser().parseExpression("7 < null").getValue();    

将导致:

  • true,当使用版本3.0.5时,由于我的意见
  • ,这是不正确的
  • false,使用版本3.2.11时

这基本上意味着交换比较逻辑和行为的重大变化,并对我们的应用程序产生强烈影响。

可能存在概念问题 - 当比较两个值时,假设它们是可比较的,它们可以相等,更少或更大,而不是另一个。但是在这个意义上,null值在空值之外没有可比性吗?

这是一个错误吗?

使用&lt;,&gt;,==,&lt; =,&gt; =运算符与其他非空值进行比较时,空值比较是否为TRUE

1 个答案:

答案 0 :(得分:0)

这不是一个错误,它是Spring团队的设计行为。

来自Spring document

  

对null的大于/小于比较遵循一个简单的规则:null在此处被视为空(即不为零)。因此,任何其他值总是大于null(X> null总是为真),并且没有其他值小于空(X

如果这种行为影响你的逻辑,我认为你可以这样做:

row