我试图将spring版本从3.0.5升级到3.2.11。
当表达式像这样比较空值时,我在SpEL遇到麻烦:
new SpelExpressionParser().parseExpression("null < 7").getValue();
以上代码的结果导致
这种不同行为的原因是,在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();
将导致:
这基本上意味着交换比较逻辑和行为的重大变化,并对我们的应用程序产生强烈影响。
可能存在概念问题 - 当比较两个值时,假设它们是可比较的,它们可以相等,更少或更大,而不是另一个。但是在这个意义上,null值在空值之外没有可比性吗?
这是一个错误吗?
使用&lt;,&gt;,==,&lt; =,&gt; =运算符与其他非空值进行比较时,空值比较是否为TRUE
答案 0 :(得分:0)
这不是一个错误,它是Spring团队的设计行为。
对null的大于/小于比较遵循一个简单的规则:null在此处被视为空(即不为零)。因此,任何其他值总是大于null(X> null总是为真),并且没有其他值小于空(X
如果这种行为影响你的逻辑,我认为你可以这样做:
row