diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/el/BindingValueExpression.java b/spring-binding/src/main/java/org/springframework/binding/expression/el/BindingValueExpression.java index b6db2686..a8ed0f72 100644 --- a/spring-binding/src/main/java/org/springframework/binding/expression/el/BindingValueExpression.java +++ b/spring-binding/src/main/java/org/springframework/binding/expression/el/BindingValueExpression.java @@ -7,8 +7,9 @@ import javax.el.PropertyNotFoundException; import javax.el.PropertyNotWritableException; import javax.el.ValueExpression; -import org.springframework.binding.convert.ConversionExecutor; +import org.springframework.binding.convert.ConversionException; import org.springframework.binding.convert.ConversionService; +import org.springframework.core.style.StylerUtils; import org.springframework.util.Assert; /** @@ -50,7 +51,7 @@ class BindingValueExpression extends ValueExpression { public Object getValue(ELContext context) throws NullPointerException, PropertyNotFoundException, ELException { Object value = targetExpression.getValue(context); - return conversionService.executeConversion(value, expectedType); + return convertValueIfNecessary(value, expectedType); } public boolean isReadOnly(ELContext context) throws NullPointerException, PropertyNotFoundException, ELException { @@ -59,11 +60,7 @@ class BindingValueExpression extends ValueExpression { public void setValue(ELContext context, Object value) throws NullPointerException, PropertyNotFoundException, PropertyNotWritableException, ELException { - Class targetType = targetExpression.getType(context); - if (value != null && targetType != null) { - ConversionExecutor converter = conversionService.getConversionExecutor(value.getClass(), targetType); - value = converter.execute(value); - } + value = convertValueIfNecessary(value, targetExpression.getType(context)); targetExpression.setValue(context, value); } @@ -92,4 +89,13 @@ class BindingValueExpression extends ValueExpression { return targetExpression.hashCode(); } -} + private Object convertValueIfNecessary(Object value, Class expectedType) { + try { + return conversionService.executeConversion(value, expectedType); + } catch (ConversionException e) { + throw new ELException("Unable to coerce value " + StylerUtils.style(value) + " to expected type [" + + expectedType + "]", e); + } + } + +} \ No newline at end of file diff --git a/spring-binding/src/test/java/org/springframework/binding/expression/el/ELExpressionParserTests.java b/spring-binding/src/test/java/org/springframework/binding/expression/el/ELExpressionParserTests.java index a13ca972..47bff70b 100644 --- a/spring-binding/src/test/java/org/springframework/binding/expression/el/ELExpressionParserTests.java +++ b/spring-binding/src/test/java/org/springframework/binding/expression/el/ELExpressionParserTests.java @@ -138,6 +138,39 @@ public class ELExpressionParserTests extends TestCase { assertEquals(null, e.getValueType(target)); } + public void testGetExpressionString() { + String expressionString = "maximum"; + Expression exp = parser.parseExpression(expressionString, null); + assertEquals("maximum", exp.getExpressionString()); + } + + public void testGetExpressionType() { + String expressionString = "maximum"; + Expression exp = parser.parseExpression(expressionString, null); + TestBean context = new TestBean(); + assertEquals(int.class, exp.getValueType(context)); + } + + public void testSetValue() { + String expressionString = "maximum"; + Expression exp = parser.parseExpression(expressionString, null); + TestBean context = new TestBean(); + exp.setValue(context, new Integer(5)); + assertEquals(5, context.getMaximum()); + } + + public void testSetValueConversionError() { + String expressionString = "maximum"; + Expression exp = parser.parseExpression(expressionString, null); + TestBean context = new TestBean(); + try { + exp.setValue(context, "bogus"); + fail("Should have failed with coersion"); + } catch (EvaluationException e) { + + } + } + public static class TestBean { private String value = "foo"; @@ -171,12 +204,12 @@ public class ELExpressionParserTests extends TestCase { return value; } - public String encode(String data) { - return "!" + data; + public void setValue(String value) { + this.value = value; } - public void setValue(String value) { - + public String encode(String data) { + return "!" + data; } public int getMaximum() { diff --git a/spring-binding/src/test/java/org/springframework/binding/expression/ognl/OgnlExpressionParserTests.java b/spring-binding/src/test/java/org/springframework/binding/expression/ognl/OgnlExpressionParserTests.java index d6fe5c55..04a1611b 100644 --- a/spring-binding/src/test/java/org/springframework/binding/expression/ognl/OgnlExpressionParserTests.java +++ b/spring-binding/src/test/java/org/springframework/binding/expression/ognl/OgnlExpressionParserTests.java @@ -156,6 +156,12 @@ public class OgnlExpressionParserTests extends TestCase { assertEquals("false0", exp.getValue(bean)); } + public void testGetExpressionString() { + String expressionString = "maximum"; + Expression exp = parser.parseExpression(expressionString, null); + assertEquals("maximum", exp.getExpressionString()); + } + public void testGetValueType() { String exp = "flag"; Expression e = parser.parseExpression(exp, null); diff --git a/spring-binding/src/test/java/org/springframework/binding/mapping/DefaultMapperTests.java b/spring-binding/src/test/java/org/springframework/binding/mapping/DefaultMapperTests.java index 585a4ef3..5cb22980 100644 --- a/spring-binding/src/test/java/org/springframework/binding/mapping/DefaultMapperTests.java +++ b/spring-binding/src/test/java/org/springframework/binding/mapping/DefaultMapperTests.java @@ -1,6 +1,8 @@ package org.springframework.binding.mapping; +import java.util.HashMap; import java.util.Locale; +import java.util.Map; import junit.framework.TestCase; @@ -43,6 +45,29 @@ public class DefaultMapperTests extends TestCase { }).size()); } + public void testMappingConversion() { + DefaultMapping mapping1 = new DefaultMapping(parser.parseExpression("beep", null), parser.parseExpression( + "beep", null)); + mapper.addMapping(mapping1); + Map bean1 = new HashMap(); + bean1.put("beep", "en"); + TestBean2 bean2 = new TestBean2(); + MappingResults results = mapper.map(bean1, bean2); + assertFalse(results.hasErrorResults()); + assertEquals(Locale.ENGLISH, bean2.beep); + } + + public void testMappingConversionError() { + DefaultMapping mapping1 = new DefaultMapping(parser.parseExpression("boop", null), parser.parseExpression( + "boop", null)); + mapper.addMapping(mapping1); + Map bean1 = new HashMap(); + bean1.put("boop", "bogus"); + TestBean2 bean2 = new TestBean2(); + MappingResults results = mapper.map(bean1, bean2); + assertTrue(results.hasErrorResults()); + } + public static class TestBean { private String foo; diff --git a/spring-binding/src/test/java/org/springframework/binding/mapping/MappingTests.java b/spring-binding/src/test/java/org/springframework/binding/mapping/MappingTests.java deleted file mode 100644 index 92098296..00000000 --- a/spring-binding/src/test/java/org/springframework/binding/mapping/MappingTests.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2004-2008 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.binding.mapping; - -import junit.framework.TestCase; - -public class MappingTests extends TestCase { - - public void testMapping() { - - } -}