diff --git a/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/OpPlus.java b/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/OpPlus.java index c6d5c19031..a449e31989 100644 --- a/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/OpPlus.java +++ b/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/OpPlus.java @@ -73,6 +73,14 @@ public class OpPlus extends Operator { } } else if (operandOne instanceof String && operandTwo instanceof String) { return new TypedValue(new StringBuilder((String) operandOne).append((String) operandTwo).toString(),STRING_TYPE_DESCRIPTOR); + } else if (operandOne instanceof String) { + StringBuilder result = new StringBuilder((String)operandOne); + result.append((operandTwo==null?"null":operandTwo.toString())); + return new TypedValue(result.toString(),STRING_TYPE_DESCRIPTOR); + } else if (operandTwo instanceof String) { + StringBuilder result = new StringBuilder((operandOne==null?"null":operandOne.toString())); + result.append((String)operandTwo); + return new TypedValue(result.toString(),STRING_TYPE_DESCRIPTOR); } return state.operate(Operation.ADD, operandOne, operandTwo); } diff --git a/org.springframework.expression/src/test/java/org/springframework/expression/spel/OperatorOverloaderTests.java b/org.springframework.expression/src/test/java/org/springframework/expression/spel/OperatorOverloaderTests.java index 3a0d69d1a8..6c5bcd5ecd 100644 --- a/org.springframework.expression/src/test/java/org/springframework/expression/spel/OperatorOverloaderTests.java +++ b/org.springframework.expression/src/test/java/org/springframework/expression/spel/OperatorOverloaderTests.java @@ -55,7 +55,7 @@ public class OperatorOverloaderTests extends ExpressionTestCase { @Test public void testSimpleOperations() throws Exception { // no built in support for this: - evaluateAndCheckError("'abc'+true",SpelMessage.OPERATOR_NOT_SUPPORTED_BETWEEN_TYPES); + evaluateAndCheckError("'abc'-true",SpelMessage.OPERATOR_NOT_SUPPORTED_BETWEEN_TYPES); StandardEvaluationContext eContext = TestScenarioCreator.getTestEvaluationContext(); eContext.setOperatorOverloader(new StringAndBooleanAddition()); @@ -65,5 +65,8 @@ public class OperatorOverloaderTests extends ExpressionTestCase { expr = (SpelExpression)parser.parseExpression("'abc'-true"); Assert.assertEquals("abc",expr.getValue(eContext)); + + expr = (SpelExpression)parser.parseExpression("'abc'+null"); + Assert.assertEquals("abcnull",expr.getValue(eContext)); } } diff --git a/org.springframework.expression/src/test/java/org/springframework/expression/spel/OperatorTests.java b/org.springframework.expression/src/test/java/org/springframework/expression/spel/OperatorTests.java index 9212d2dfe7..c6bbb61277 100644 --- a/org.springframework.expression/src/test/java/org/springframework/expression/spel/OperatorTests.java +++ b/org.springframework.expression/src/test/java/org/springframework/expression/spel/OperatorTests.java @@ -153,9 +153,10 @@ public class OperatorTests extends ExpressionTestCase { evaluate("3.0f + 5.0f", 8.0d, Double.class); evaluate("3.0d + 5.0d", 8.0d, Double.class); - evaluateAndCheckError("'ab' + 2", SpelMessage.OPERATOR_NOT_SUPPORTED_BETWEEN_TYPES); - evaluateAndCheckError("2+'a' ", SpelMessage.OPERATOR_NOT_SUPPORTED_BETWEEN_TYPES); - evaluateAndCheckError("2+'ab'",SpelMessage.OPERATOR_NOT_SUPPORTED_BETWEEN_TYPES); + evaluate("'ab' + 2", "ab2", String.class); + evaluate("2 + 'a'", "2a", String.class); + evaluate("'ab' + null", "abnull", String.class); + evaluate("null + 'ab'", "nullab", String.class); // AST: SpelExpression expr = (SpelExpression)parser.parseExpression("+3");