diff --git a/org.springframework.expression/src/main/java/org/springframework/expression/spel/support/StandardTypeComparator.java b/org.springframework.expression/src/main/java/org/springframework/expression/spel/support/StandardTypeComparator.java index 9f00ed34ec..4cb99f4d5f 100644 --- a/org.springframework.expression/src/main/java/org/springframework/expression/spel/support/StandardTypeComparator.java +++ b/org.springframework.expression/src/main/java/org/springframework/expression/spel/support/StandardTypeComparator.java @@ -33,9 +33,9 @@ public class StandardTypeComparator implements TypeComparator { 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; + return right == null ? 0 : -1; } else if (right == null) { - return -1; // left cannot be null + return 1; // left cannot be null } // Basic number comparisons diff --git a/org.springframework.expression/src/test/java/org/springframework/expression/spel/DefaultComparatorUnitTests.java b/org.springframework.expression/src/test/java/org/springframework/expression/spel/DefaultComparatorUnitTests.java index 98f1ff8a9b..37c0dd935d 100644 --- a/org.springframework.expression/src/test/java/org/springframework/expression/spel/DefaultComparatorUnitTests.java +++ b/org.springframework.expression/src/test/java/org/springframework/expression/spel/DefaultComparatorUnitTests.java @@ -61,9 +61,9 @@ public class DefaultComparatorUnitTests { @Test public void testNulls() throws EvaluationException { TypeComparator comparator = new StandardTypeComparator(); - Assert.assertTrue(comparator.compare(null,"abc")>0); + Assert.assertTrue(comparator.compare(null,"abc")<0); Assert.assertTrue(comparator.compare(null,null)==0); - Assert.assertTrue(comparator.compare("abc",null)<0); + Assert.assertTrue(comparator.compare("abc",null)>0); } @Test diff --git a/org.springframework.expression/src/test/java/org/springframework/expression/spel/SpringEL300Tests.java b/org.springframework.expression/src/test/java/org/springframework/expression/spel/SpringEL300Tests.java index f92a4b23e6..f98ca94dd9 100644 --- a/org.springframework.expression/src/test/java/org/springframework/expression/spel/SpringEL300Tests.java +++ b/org.springframework.expression/src/test/java/org/springframework/expression/spel/SpringEL300Tests.java @@ -16,6 +16,8 @@ package org.springframework.expression.spel; +import static org.junit.Assert.assertEquals; + import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; @@ -49,7 +51,7 @@ import org.springframework.expression.spel.support.StandardTypeLocator; * @author Andy Clement */ public class SpringEL300Tests extends ExpressionTestCase { - + @Test public void testNPE_SPR5661() { evaluate("joinThreeStrings('a',null,'c')", "anullc", String.class); @@ -766,6 +768,48 @@ public class SpringEL300Tests extends ExpressionTestCase { ms.put("def","pqr"); } } + + static class D { + public String a; + + private D(String s) { + a=s; + } + + public String toString() { + return "D("+a+")"; + } + } + + @Test + public void testGreaterThanWithNulls_SPR7840() throws Exception { + List list = new ArrayList(); + list.add(new D("aaa")); + list.add(new D("bbb")); + list.add(new D(null)); + list.add(new D("ccc")); + list.add(new D(null)); + list.add(new D("zzz")); + + StandardEvaluationContext ctx = new StandardEvaluationContext(list); + SpelExpressionParser parser = new SpelExpressionParser(); + + String el1 = "#root.?[a < 'hhh']"; + SpelExpression exp = parser.parseRaw(el1); + Object value = exp.getValue(ctx); + assertEquals("[D(aaa), D(bbb), D(null), D(ccc), D(null)]",value.toString()); + + String el2 = "#root.?[a > 'hhh']"; + SpelExpression exp2 = parser.parseRaw(el2); + Object value2 = exp2.getValue(ctx); + assertEquals("[D(zzz)]",value2.toString()); + + // trim out the nulls first + String el3 = "#root.?[a!=null].?[a < 'hhh']"; + SpelExpression exp3 = parser.parseRaw(el3); + Object value3 = exp3.getValue(ctx); + assertEquals("[D(aaa), D(bbb), D(ccc)]",value3.toString()); + } }