diff --git a/org.springframework.context/src/main/java/org/springframework/ui/binding/Binder.java b/org.springframework.context/src/main/java/org/springframework/ui/binding/Binder.java index 3a1aaff0046..158c915abf8 100644 --- a/org.springframework.context/src/main/java/org/springframework/ui/binding/Binder.java +++ b/org.springframework.context/src/main/java/org/springframework/ui/binding/Binder.java @@ -29,13 +29,13 @@ import org.springframework.ui.format.Formatter; * @see #add(BindingConfiguration) * @see #bind(UserValues) */ -public interface Binder { +public interface Binder { /** * The model object this binder binds to. * @return the model object */ - M getModel(); + Object getModel(); /** * Configures if this binder is strict; a strict binder requires all bindings to be registered explicitly using {@link #add(BindingConfiguration)}. diff --git a/org.springframework.context/src/main/java/org/springframework/ui/binding/support/GenericBinder.java b/org.springframework.context/src/main/java/org/springframework/ui/binding/support/GenericBinder.java index 0398a61dc2b..452459f4b2b 100644 --- a/org.springframework.context/src/main/java/org/springframework/ui/binding/support/GenericBinder.java +++ b/org.springframework.context/src/main/java/org/springframework/ui/binding/support/GenericBinder.java @@ -55,17 +55,15 @@ import org.springframework.ui.format.Formatter; /** * Binds user-entered values to properties of a model object. * @author Keith Donald - * - * @param The type of model object this binder binds to - TODO is this worth it? * @see #add(BindingConfiguration) * @see #bind(UserValues) */ @SuppressWarnings("unchecked") -public class GenericBinder implements Binder { +public class GenericBinder implements Binder { private static final String[] EMPTY_STRING_ARRAY = new String[0]; - private M model; + private Object model; private Map bindings; @@ -101,7 +99,7 @@ public class GenericBinder implements Binder { * Creates a new binder for the model object. * @param model the model object containing properties this binder will bind to */ - public GenericBinder(M model) { + public GenericBinder(Object model) { this.model = model; bindings = new HashMap(); int parserConfig = SpelExpressionParserConfiguration.CreateListsOnAttemptToIndexIntoNull @@ -110,7 +108,7 @@ public class GenericBinder implements Binder { typeConverter = new DefaultTypeConverter(); } - public M getModel() { + public Object getModel() { return model; } diff --git a/org.springframework.context/src/main/java/org/springframework/ui/binding/support/WebBinder.java b/org.springframework.context/src/main/java/org/springframework/ui/binding/support/WebBinder.java index 078fac4027b..4104f808fb9 100644 --- a/org.springframework.context/src/main/java/org/springframework/ui/binding/support/WebBinder.java +++ b/org.springframework.context/src/main/java/org/springframework/ui/binding/support/WebBinder.java @@ -23,11 +23,10 @@ import org.springframework.ui.binding.UserValues; * A binder designed for use in HTTP (web) environments. * Suited for binding user-provided HTTP query parameters to model properties. * @author Keith Donald - * @param The type of model object this binder binds to * @see #setFieldDefaultPrefix(String) * @see #setFieldMarkerPrefix(String) */ -public class WebBinder extends GenericBinder { +public class WebBinder extends GenericBinder { private String fieldMarkerPrefix = "_"; @@ -37,7 +36,7 @@ public class WebBinder extends GenericBinder { * Creates a new web binder for the model object. * @param model the model object containing properties this binder will bind to */ - public WebBinder(M model) { + public WebBinder(Object model) { super(model); } diff --git a/org.springframework.context/src/test/java/org/springframework/ui/binding/support/GenericBinderTests.java b/org.springframework.context/src/test/java/org/springframework/ui/binding/support/GenericBinderTests.java index 4d86ad863fb..427bd40438d 100644 --- a/org.springframework.context/src/test/java/org/springframework/ui/binding/support/GenericBinderTests.java +++ b/org.springframework.context/src/test/java/org/springframework/ui/binding/support/GenericBinderTests.java @@ -33,8 +33,13 @@ import org.springframework.ui.format.number.IntegerFormatter; public class GenericBinderTests { + private TestBean bean; + private Binder binder; + @Before public void setUp() { + bean = new TestBean(); + binder = new GenericBinder(bean); LocaleContextHolder.setLocale(Locale.US); } @@ -45,7 +50,6 @@ public class GenericBinderTests { @Test public void bindSingleValuesWithDefaultTypeConverterConversion() { - Binder binder = new GenericBinder(new TestBean()); UserValues values = new UserValues(); values.add("string", "test"); values.add("integer", "3"); @@ -68,14 +72,13 @@ public class GenericBinderTests { assertNull(results.get(2).getErrorCause()); assertEquals("BAR", results.get(2).getUserValue()); - assertEquals("test", binder.getModel().getString()); - assertEquals(3, binder.getModel().getInteger()); - assertEquals(FooEnum.BAR, binder.getModel().getFoo()); + assertEquals("test", bean.getString()); + assertEquals(3, bean.getInteger()); + assertEquals(FooEnum.BAR, bean.getFoo()); } @Test public void bindSingleValuesWithDefaultTypeCoversionFailure() { - Binder binder = new GenericBinder(new TestBean()); UserValues values = new UserValues(); values.add("string", "test"); // bad value @@ -89,46 +92,40 @@ public class GenericBinderTests { @Test public void bindSingleValuePropertyFormatter() throws ParseException { - Binder binder = new GenericBinder(new TestBean()); binder.add(new BindingConfiguration("date", new DateFormatter())); binder.bind(UserValues.single("date", "2009-06-01")); - assertEquals(new DateFormatter().parse("2009-06-01", Locale.US), binder.getModel().getDate()); + assertEquals(new DateFormatter().parse("2009-06-01", Locale.US), bean.getDate()); } @Test public void bindSingleValuePropertyFormatterParseException() { - Binder binder = new GenericBinder(new TestBean()); binder.add(new BindingConfiguration("date", new DateFormatter())); binder.bind(UserValues.single("date", "bogus")); } @Test public void bindSingleValueWithFormatterRegistedByType() throws ParseException { - Binder binder = new GenericBinder(new TestBean()); binder.add(new DateFormatter(), Date.class); binder.bind(UserValues.single("date", "2009-06-01")); - assertEquals(new DateFormatter().parse("2009-06-01", Locale.US), binder.getModel().getDate()); + assertEquals(new DateFormatter().parse("2009-06-01", Locale.US), bean.getDate()); } @Test public void bindSingleValueWithFormatterRegisteredByAnnotation() throws ParseException { - Binder binder = new GenericBinder(new TestBean()); binder.add(new CurrencyFormatter(), CurrencyFormat.class); binder.bind(UserValues.single("currency", "$23.56")); - assertEquals(new BigDecimal("23.56"), binder.getModel().getCurrency()); + assertEquals(new BigDecimal("23.56"), bean.getCurrency()); } @Test public void bindSingleValueWithnAnnotationFormatterFactoryRegistered() throws ParseException { - Binder binder = new GenericBinder(new TestBean()); binder.add(new CurrencyAnnotationFormatterFactory()); binder.bind(UserValues.single("currency", "$23.56")); - assertEquals(new BigDecimal("23.56"), binder.getModel().getCurrency()); + assertEquals(new BigDecimal("23.56"), bean.getCurrency()); } @Test public void bindSingleValuePropertyNotFound() throws ParseException { - Binder binder = new GenericBinder(new TestBean()); List results = binder.bind(UserValues.single("bogus", "2009-06-01")); assertEquals(1, results.size()); assertTrue(results.get(0).isError()); @@ -137,7 +134,6 @@ public class GenericBinderTests { @Test public void bindUserValuesCreatedFromUserMap() { - Binder binder = new GenericBinder(new TestBean()); Map userMap = new LinkedHashMap(); userMap.put("string", "test"); userMap.put("integer", "3"); @@ -146,13 +142,12 @@ public class GenericBinderTests { assertEquals(2, results.size()); assertEquals("test", results.get(0).getUserValue()); assertEquals("3", results.get(1).getUserValue()); - assertEquals("test", binder.getModel().getString()); - assertEquals(3, binder.getModel().getInteger()); + assertEquals("test", bean.getString()); + assertEquals(3, bean.getInteger()); } @Test public void getBindingOptimistic() { - Binder binder = new GenericBinder(new TestBean()); Binding b = binder.getBinding("integer"); assertFalse(b.isCollection()); assertEquals("0", b.getValue()); @@ -163,7 +158,6 @@ public class GenericBinderTests { @Test public void getBindingStrict() { - Binder binder = new GenericBinder(new TestBean()); binder.setStrict(true); Binding b = binder.getBinding("integer"); assertNull(b); @@ -178,7 +172,6 @@ public class GenericBinderTests { @Test public void getBindingCustomFormatter() { - Binder binder = new GenericBinder(new TestBean()); binder.add(new BindingConfiguration("currency", new CurrencyFormatter())); Binding b = binder.getBinding("currency"); assertFalse(b.isCollection()); @@ -189,7 +182,6 @@ public class GenericBinderTests { @Test public void getBindingCustomFormatterRequiringTypeCoersion() { - Binder binder = new GenericBinder(new TestBean()); // IntegerFormatter formats Longs, so conversion from Integer -> Long is performed binder.add(new BindingConfiguration("integer", new IntegerFormatter())); Binding b = binder.getBinding("integer"); @@ -199,14 +191,13 @@ public class GenericBinderTests { @Test public void getBindingMultiValued() { - Binder binder = new GenericBinder(new TestBean()); Binding b = binder.getBinding("foos"); assertTrue(b.isCollection()); assertEquals(0, b.getCollectionValues().length); b.setValue(new String[] { "BAR", "BAZ", "BOOP" }); - assertEquals(FooEnum.BAR, binder.getModel().getFoos().get(0)); - assertEquals(FooEnum.BAZ, binder.getModel().getFoos().get(1)); - assertEquals(FooEnum.BOOP, binder.getModel().getFoos().get(2)); + assertEquals(FooEnum.BAR, bean.getFoos().get(0)); + assertEquals(FooEnum.BAZ, bean.getFoos().get(1)); + assertEquals(FooEnum.BOOP, bean.getFoos().get(2)); String[] values = b.getCollectionValues(); assertEquals(3, values.length); assertEquals("BAR", values[0]); @@ -216,7 +207,6 @@ public class GenericBinderTests { @Test public void getBindingMultiValuedTypeConversionFailure() { - Binder binder = new GenericBinder(new TestBean()); Binding b = binder.getBinding("foos"); assertTrue(b.isCollection()); assertEquals(0, b.getCollectionValues().length); @@ -228,8 +218,6 @@ public class GenericBinderTests { @Test public void bindHandleNullValueInNestedPath() { - TestBean testbean = new TestBean(); - Binder binder = new GenericBinder(testbean); UserValues values = new UserValues(); // EL configured with some options from SpelExpressionParserConfiguration: @@ -257,15 +245,14 @@ public class GenericBinderTests { values.add("addresses[5].zip", "32901"); List results = binder.bind(values); - Assert.assertEquals(6,testbean.addresses.size()); - Assert.assertEquals("Palm Bay",testbean.addresses.get(1).city); - Assert.assertNotNull(testbean.addresses.get(2)); + Assert.assertEquals(6, bean.addresses.size()); + Assert.assertEquals("Palm Bay", bean.addresses.get(1).city); + Assert.assertNotNull(bean.addresses.get(2)); assertEquals(12, results.size()); } @Test public void formatPossibleValue() { - Binder binder = new GenericBinder(new TestBean()); binder.add(new BindingConfiguration("currency", new CurrencyFormatter())); Binding b = binder.getBinding("currency"); assertEquals("$5.00", b.format(new BigDecimal("5"))); diff --git a/org.springframework.context/src/test/java/org/springframework/ui/binding/support/WebBinderTests.java b/org.springframework.context/src/test/java/org/springframework/ui/binding/support/WebBinderTests.java index cfe206209fe..ffec0d3ec5d 100644 --- a/org.springframework.context/src/test/java/org/springframework/ui/binding/support/WebBinderTests.java +++ b/org.springframework.context/src/test/java/org/springframework/ui/binding/support/WebBinderTests.java @@ -24,6 +24,9 @@ import org.springframework.ui.format.number.CurrencyFormat; public class WebBinderTests { + TestBean bean = new TestBean(); + Binder binder = new WebBinder(bean); + @Before public void setUp() { LocaleContextHolder.setLocale(Locale.US); @@ -36,7 +39,6 @@ public class WebBinderTests { @Test public void bindUserValuesCreatedFromUserMap() throws ParseException { - Binder binder = new WebBinder(new TestBean()); binder.add(new CurrencyAnnotationFormatterFactory()); binder.add(new BindingConfiguration("date", new DateFormatter())); Map userMap = new LinkedHashMap(); @@ -57,12 +59,12 @@ public class WebBinderTests { assertEquals("$5.00", results.get(4).getUserValue()); assertEquals(null, results.get(5).getUserValue()); - assertEquals("test", binder.getModel().getString()); - assertEquals(0, binder.getModel().getInteger()); - assertEquals(new DateFormatter().parse("2009-06-10", Locale.US), binder.getModel().getDate()); - assertEquals(false, binder.getModel().isBool()); - assertEquals(new BigDecimal("5.00"), binder.getModel().getCurrency()); - assertEquals(null, binder.getModel().getAddresses()); + assertEquals("test", bean.getString()); + assertEquals(0, bean.getInteger()); + assertEquals(new DateFormatter().parse("2009-06-10", Locale.US), bean.getDate()); + assertEquals(false, bean.isBool()); + assertEquals(new BigDecimal("5.00"), bean.getCurrency()); + assertEquals(null, bean.getAddresses()); } public static enum FooEnum {