From 8d55c7d60a004cf5bf43dd83107a9e69ac4b59e6 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 21 Dec 2016 09:31:55 +0100 Subject: [PATCH] Backported DataBinder configuration tests Issue: SPR-15009 --- .../validation/DataBinderTests.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/spring-context/src/test/java/org/springframework/validation/DataBinderTests.java b/spring-context/src/test/java/org/springframework/validation/DataBinderTests.java index a2a9fc8bcd5..337d93f4296 100644 --- a/spring-context/src/test/java/org/springframework/validation/DataBinderTests.java +++ b/spring-context/src/test/java/org/springframework/validation/DataBinderTests.java @@ -40,6 +40,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.springframework.beans.BeanWrapper; import org.springframework.beans.InvalidPropertyException; import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.NotWritablePropertyException; @@ -2013,6 +2014,77 @@ public class DataBinderTests { binder.setAutoGrowCollectionLimit(257); } + @Test // SPR-15009 + public void testSetCustomMessageCodesResolverBeforeInitializeBindingResultForBeanPropertyAccess() { + TestBean testBean = new TestBean(); + DataBinder binder = new DataBinder(testBean, "testBean"); + DefaultMessageCodesResolver messageCodesResolver = new DefaultMessageCodesResolver(); + messageCodesResolver.setPrefix("errors."); + binder.setMessageCodesResolver(messageCodesResolver); + binder.setAutoGrowCollectionLimit(512); // allow configuration after set a MessageCodesResolver + binder.initBeanPropertyAccess(); + + MutablePropertyValues mpv = new MutablePropertyValues(); + mpv.add("age", "invalid"); + binder.bind(mpv); + assertEquals("errors.typeMismatch", binder.getBindingResult().getFieldError("age").getCode()); + assertEquals(512, BeanWrapper.class.cast(binder.getInternalBindingResult().getPropertyAccessor()).getAutoGrowCollectionLimit()); + } + + @Test // SPR-15009 + public void testSetCustomMessageCodesResolverBeforeInitializeBindingResultForDirectFieldAccess() { + TestBean testBean = new TestBean(); + DataBinder binder = new DataBinder(testBean, "testBean"); + DefaultMessageCodesResolver messageCodesResolver = new DefaultMessageCodesResolver(); + messageCodesResolver.setPrefix("errors."); + binder.setMessageCodesResolver(messageCodesResolver); + binder.initDirectFieldAccess(); + + MutablePropertyValues mpv = new MutablePropertyValues(); + mpv.add("age", "invalid"); + binder.bind(mpv); + assertEquals("errors.typeMismatch", binder.getBindingResult().getFieldError("age").getCode()); + } + + @Test // SPR-15009 + public void testSetCustomMessageCodesResolverAfterInitializeBindingResult() { + TestBean testBean = new TestBean(); + DataBinder binder = new DataBinder(testBean, "testBean"); + binder.initBeanPropertyAccess(); + DefaultMessageCodesResolver messageCodesResolver = new DefaultMessageCodesResolver(); + messageCodesResolver.setPrefix("errors."); + binder.setMessageCodesResolver(messageCodesResolver); + + MutablePropertyValues mpv = new MutablePropertyValues(); + mpv.add("age", "invalid"); + binder.bind(mpv); + assertEquals("errors.typeMismatch", binder.getBindingResult().getFieldError("age").getCode()); + } + + @Test // SPR-15009 + public void testSetMessageCodesResolverIsNullAfterInitializeBindingResult() { + TestBean testBean = new TestBean(); + DataBinder binder = new DataBinder(testBean, "testBean"); + binder.initBeanPropertyAccess(); + binder.setMessageCodesResolver(null); + + MutablePropertyValues mpv = new MutablePropertyValues(); + mpv.add("age", "invalid"); + binder.bind(mpv); + assertEquals("typeMismatch", binder.getBindingResult().getFieldError("age").getCode()); // Keep a default MessageCodesResolver + } + + @Test // SPR-15009 + public void testCallSetMessageCodesResolverTwice() { + expectedException.expect(IllegalStateException.class); + expectedException.expectMessage("DataBinder is already initialized with MessageCodesResolver"); + + TestBean testBean = new TestBean(); + DataBinder binder = new DataBinder(testBean, "testBean"); + binder.setMessageCodesResolver(new DefaultMessageCodesResolver()); + binder.setMessageCodesResolver(new DefaultMessageCodesResolver()); + + } @SuppressWarnings("unused") private static class BeanWithIntegerList {