@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()); }
@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 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 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 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()); }
/** * Create a new binder instance for the given form object and request context. Can be overridden to plug in custom * DataBinder subclasses. * <p> * Default implementation creates a standard WebDataBinder, and invokes * {@link #initBinder(RequestContext, DataBinder)} and {@link #registerPropertyEditors(PropertyEditorRegistry)}. * @param context the action execution context, for accessing and setting data in "flow scope" or "request scope" * @param formObject the form object to bind onto * @return the new binder instance * @throws Exception when an unrecoverable exception occurs * @see WebDataBinder * @see #initBinder(RequestContext, DataBinder) * @see #setMessageCodesResolver(MessageCodesResolver) */ protected DataBinder createBinder(RequestContext context, Object formObject) throws Exception { DataBinder binder = new WebDataBinder(formObject, getFormObjectName()); if (getMessageCodesResolver() != null) { binder.setMessageCodesResolver(getMessageCodesResolver()); } initBinder(context, binder); registerPropertyEditors(context, binder); return binder; }
/** * Create a new binder instance for the given form object and request context. Can be overridden to plug in custom * DataBinder subclasses. * <p> * Default implementation creates a standard WebDataBinder, and invokes * {@link #initBinder(RequestContext, DataBinder)} and {@link #registerPropertyEditors(PropertyEditorRegistry)}. * @param context the action execution context, for accessing and setting data in "flow scope" or "request scope" * @param formObject the form object to bind onto * @return the new binder instance * @throws Exception when an unrecoverable exception occurs * @see WebDataBinder * @see #initBinder(RequestContext, DataBinder) * @see #setMessageCodesResolver(MessageCodesResolver) */ protected DataBinder createBinder(RequestContext context, Object formObject) throws Exception { DataBinder binder = new WebDataBinder(formObject, getFormObjectName()); if (getMessageCodesResolver() != null) { binder.setMessageCodesResolver(getMessageCodesResolver()); } initBinder(context, binder); registerPropertyEditors(context, binder); return binder; }
/** * Create a new binder instance for the given form object and request context. Can be overridden to plug in custom * DataBinder subclasses. * <p> * Default implementation creates a standard WebDataBinder, and invokes * {@link #initBinder(RequestContext, DataBinder)} and {@link #registerPropertyEditors(PropertyEditorRegistry)}. * @param context the action execution context, for accessing and setting data in "flow scope" or "request scope" * @param formObject the form object to bind onto * @return the new binder instance * @throws Exception when an unrecoverable exception occurs * @see WebDataBinder * @see #initBinder(RequestContext, DataBinder) * @see #setMessageCodesResolver(MessageCodesResolver) */ protected DataBinder createBinder(RequestContext context, Object formObject) throws Exception { DataBinder binder = new WebDataBinder(formObject, getFormObjectName()); if (getMessageCodesResolver() != null) { binder.setMessageCodesResolver(getMessageCodesResolver()); } initBinder(context, binder); registerPropertyEditors(context, binder); return binder; }
/** * Create a new binder instance for the given form object and request context. Can be overridden to plug in custom * DataBinder subclasses. * <p> * Default implementation creates a standard WebDataBinder, and invokes * {@link #initBinder(RequestContext, DataBinder)} and {@link #registerPropertyEditors(PropertyEditorRegistry)}. * @param context the action execution context, for accessing and setting data in "flow scope" or "request scope" * @param formObject the form object to bind onto * @return the new binder instance * @throws Exception when an unrecoverable exception occurs * @see WebDataBinder * @see #initBinder(RequestContext, DataBinder) * @see #setMessageCodesResolver(MessageCodesResolver) */ protected DataBinder createBinder(RequestContext context, Object formObject) throws Exception { DataBinder binder = new WebDataBinder(formObject, getFormObjectName()); if (getMessageCodesResolver() != null) { binder.setMessageCodesResolver(getMessageCodesResolver()); } initBinder(context, binder); registerPropertyEditors(context, binder); return binder; }