diff --git a/spring-webflow/src/main/java/org/springframework/webflow/mvc/view/BindingModel.java b/spring-webflow/src/main/java/org/springframework/webflow/mvc/view/BindingModel.java index 5c0703e2..e20b24b9 100644 --- a/spring-webflow/src/main/java/org/springframework/webflow/mvc/view/BindingModel.java +++ b/spring-webflow/src/main/java/org/springframework/webflow/mvc/view/BindingModel.java @@ -53,6 +53,7 @@ import org.springframework.webflow.engine.builder.BinderConfiguration.Binding; * @see AbstractMvcView * * @author Keith Donald + * @author Jeremy Grelle */ public class BindingModel extends AbstractErrors implements BindingResult { @@ -189,7 +190,11 @@ public class BindingModel extends AbstractErrors implements BindingResult { valueType = parseFieldExpression(field).getValueType(boundObject); } } - return new ConversionExecutorPropertyEditor(conversionService, valueType, converterId); + if (valueType != null) { + return new ConversionExecutorPropertyEditor(conversionService, valueType, converterId); + } else { + return null; + } } else { return null; } diff --git a/spring-webflow/src/test/java/org/springframework/webflow/TestBean.java b/spring-webflow/src/test/java/org/springframework/webflow/TestBean.java index 875051e5..8483cc0e 100644 --- a/spring-webflow/src/test/java/org/springframework/webflow/TestBean.java +++ b/spring-webflow/src/test/java/org/springframework/webflow/TestBean.java @@ -17,6 +17,8 @@ package org.springframework.webflow; import java.io.Serializable; import java.util.Date; +import java.util.HashMap; +import java.util.Map; /** * Simple test bean used by some test cases. Note that this bean has value semantics. @@ -31,6 +33,8 @@ public class TestBean implements Serializable { public boolean executed; + public Map emptyMap; + public void execute() { this.executed = true; } @@ -47,6 +51,14 @@ public class TestBean implements Serializable { return datum3; } + public Map getEmptyMap() { + if (emptyMap == null) { + emptyMap = new HashMap(); + emptyMap.put("foo", null); + } + return emptyMap; + } + public void setDatum3(Date datum3) { this.datum3 = datum3; } diff --git a/spring-webflow/src/test/java/org/springframework/webflow/mvc/view/BindingModelTests.java b/spring-webflow/src/test/java/org/springframework/webflow/mvc/view/AbstractBindingModelTests.java similarity index 95% rename from spring-webflow/src/test/java/org/springframework/webflow/mvc/view/BindingModelTests.java rename to spring-webflow/src/test/java/org/springframework/webflow/mvc/view/AbstractBindingModelTests.java index c9cd8acf..2a0b5867 100644 --- a/spring-webflow/src/test/java/org/springframework/webflow/mvc/view/BindingModelTests.java +++ b/spring-webflow/src/test/java/org/springframework/webflow/mvc/view/AbstractBindingModelTests.java @@ -21,9 +21,8 @@ import org.springframework.validation.FieldError; import org.springframework.webflow.TestBean; import org.springframework.webflow.engine.builder.BinderConfiguration; import org.springframework.webflow.engine.builder.BinderConfiguration.Binding; -import org.springframework.webflow.expression.DefaultExpressionParserFactory; -public class BindingModelTests extends TestCase { +public abstract class AbstractBindingModelTests extends TestCase { BindingModel model; DefaultMessageContext messages; @@ -35,10 +34,12 @@ public class BindingModelTests extends TestCase { testBean = new TestBean(); messages = new DefaultMessageContext(); conversionService = new DefaultConversionService(); - expressionParser = DefaultExpressionParserFactory.getExpressionParser(); + expressionParser = getExpressionParser(); model = new BindingModel("testBean", testBean, expressionParser, conversionService, messages); } + protected abstract ExpressionParser getExpressionParser(); + public void testInitialState() { assertEquals(0, model.getErrorCount()); assertEquals(0, model.getFieldErrorCount()); @@ -66,8 +67,7 @@ public class BindingModelTests extends TestCase { } public void testGetFieldValueNonStringNoConversionService() { - model = new BindingModel("testBean", testBean, DefaultExpressionParserFactory.getExpressionParser(), null, - messages); + model = new BindingModel("testBean", testBean, getExpressionParser(), null, messages); testBean.datum2 = 3; assertEquals(new Integer(3), model.getFieldValue("datum2")); } diff --git a/spring-webflow/src/test/java/org/springframework/webflow/mvc/view/DefaultBindingModelTests.java b/spring-webflow/src/test/java/org/springframework/webflow/mvc/view/DefaultBindingModelTests.java new file mode 100644 index 00000000..d9ee3b29 --- /dev/null +++ b/spring-webflow/src/test/java/org/springframework/webflow/mvc/view/DefaultBindingModelTests.java @@ -0,0 +1,11 @@ +package org.springframework.webflow.mvc.view; + +import org.springframework.binding.expression.ExpressionParser; +import org.springframework.webflow.expression.DefaultExpressionParserFactory; + +public class DefaultBindingModelTests extends AbstractBindingModelTests { + + protected ExpressionParser getExpressionParser() { + return DefaultExpressionParserFactory.getExpressionParser(); + } +} diff --git a/spring-webflow/src/test/java/org/springframework/webflow/mvc/view/SpringBeanBindingModelTests.java b/spring-webflow/src/test/java/org/springframework/webflow/mvc/view/SpringBeanBindingModelTests.java new file mode 100644 index 00000000..1897b551 --- /dev/null +++ b/spring-webflow/src/test/java/org/springframework/webflow/mvc/view/SpringBeanBindingModelTests.java @@ -0,0 +1,19 @@ +package org.springframework.webflow.mvc.view; + +import java.beans.PropertyEditor; + +import org.springframework.binding.expression.ExpressionParser; +import org.springframework.binding.expression.beanwrapper.BeanWrapperExpressionParser; + +public class SpringBeanBindingModelTests extends AbstractBindingModelTests { + + protected ExpressionParser getExpressionParser() { + return new BeanWrapperExpressionParser(); + } + + // See SWF-1132 + public void testFindPropertyEditorForUndeterminableType() { + PropertyEditor editor = model.findEditor("emptyMap['foo']", null); + assertNull(editor); + } +}