@RequestMapping("/myPath4.*") public void myHandle(TestBean tb, Errors errors, HttpServletResponse response) throws IOException { response.getWriter().write("test-" + tb.getName() + "-" + errors.getFieldError("age").getCode()); } }
@RequestMapping("/myPath4.do") public void myHandle(TestBean tb, Errors errors, HttpServletResponse response) throws IOException { response.getWriter().write("test-" + tb.getName() + "-" + errors.getFieldError("age").getCode()); } }
/** * Assert a field error code for a model attribute using a {@link org.hamcrest.Matcher}. * @since 4.1 */ public <T> ResultMatcher attributeHasFieldErrorCode(final String name, final String fieldName, final Matcher<? super String> matcher) { return mvcResult -> { ModelAndView mav = getModelAndView(mvcResult); BindingResult result = getBindingResult(mav, name); assertTrue("No errors for attribute: [" + name + "]", result.hasErrors()); FieldError fieldError = result.getFieldError(fieldName); if (fieldError == null) { fail("No errors for field '" + fieldName + "' of attribute '" + name + "'"); } String code = fieldError.getCode(); assertThat("Field name '" + fieldName + "' of attribute '" + name + "'", code, matcher); }; }
@RequestMapping("/myPath4.*") public void myHandle(TestBean tb, Errors errors, HttpServletResponse response) throws IOException { response.getWriter().write("test-" + tb.getName() + "-" + errors.getFieldError("age").getCode()); }
/** * Assert a field error code for a model attribute using exact String match. * @since 4.1 */ public ResultMatcher attributeHasFieldErrorCode(final String name, final String fieldName, final String error) { return mvcResult -> { ModelAndView mav = getModelAndView(mvcResult); BindingResult result = getBindingResult(mav, name); assertTrue("No errors for attribute '" + name + "'", result.hasErrors()); FieldError fieldError = result.getFieldError(fieldName); if (fieldError == null) { fail("No errors for field '" + fieldName + "' of attribute '" + name + "'"); } String code = fieldError.getCode(); assertTrue("Expected error code '" + error + "' but got '" + code + "'", error.equals(code)); }; }
@Test public void testAddAllErrors() { TestBean rod = new TestBean(); DataBinder binder = new DataBinder(rod, "person"); MutablePropertyValues pvs = new MutablePropertyValues(); pvs.add("age", "32x"); binder.bind(pvs); Errors errors = binder.getBindingResult(); BeanPropertyBindingResult errors2 = new BeanPropertyBindingResult(rod, "person"); errors.rejectValue("name", "badName"); errors.addAllErrors(errors2); FieldError ageError = errors.getFieldError("age"); assertEquals("typeMismatch", ageError.getCode()); FieldError nameError = errors.getFieldError("name"); assertEquals("badName", nameError.getCode()); }
@Test public void testValidationUtilsNull() throws Exception { TestBean tb = new TestBean(); Errors errors = new BeanPropertyBindingResult(tb, "tb"); Validator testValidator = new EmptyValidator(); testValidator.validate(tb, errors); assertTrue(errors.hasFieldErrors("name")); assertEquals("EMPTY", errors.getFieldError("name").getCode()); }
@Test public void testValidationUtilsEmpty() throws Exception { TestBean tb = new TestBean(""); Errors errors = new BeanPropertyBindingResult(tb, "tb"); Validator testValidator = new EmptyValidator(); testValidator.validate(tb, errors); assertTrue(errors.hasFieldErrors("name")); assertEquals("EMPTY", errors.getFieldError("name").getCode()); }
@Test public void testInvokeValidatorSunnyDay() throws Exception { TestBean tb = new TestBean(); Errors errors = new BeanPropertyBindingResult(tb, "tb"); ValidationUtils.invokeValidator(new EmptyValidator(), tb, errors); assertTrue(errors.hasFieldErrors("name")); assertEquals("EMPTY", errors.getFieldError("name").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 public void testBindingErrors() { TestBean rod = new TestBean(); DataBinder binder = new DataBinder(rod, "person"); MutablePropertyValues pvs = new MutablePropertyValues(); pvs.add("age", "32x"); binder.bind(pvs); Errors errors = binder.getBindingResult(); FieldError ageError = errors.getFieldError("age"); assertEquals("typeMismatch", ageError.getCode()); ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasename("org.springframework.validation.messages1"); String msg = messageSource.getMessage(ageError, Locale.getDefault()); assertEquals("Field age did not have correct type", msg); messageSource = new ResourceBundleMessageSource(); messageSource.setBasename("org.springframework.validation.messages2"); msg = messageSource.getMessage(ageError, Locale.getDefault()); assertEquals("Field Age did not have correct type", msg); messageSource = new ResourceBundleMessageSource(); messageSource.setBasename("org.springframework.validation.messages3"); msg = messageSource.getMessage(ageError, Locale.getDefault()); assertEquals("Field Person Age did not have correct type", msg); }
@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 public void testValidationUtilsEmptyVariants() { TestBean tb = new TestBean(); Errors errors = new BeanPropertyBindingResult(tb, "tb"); ValidationUtils.rejectIfEmpty(errors, "name", "EMPTY_OR_WHITESPACE", new Object[] {"arg"}); assertTrue(errors.hasFieldErrors("name")); assertEquals("EMPTY_OR_WHITESPACE", errors.getFieldError("name").getCode()); assertEquals("arg", errors.getFieldError("name").getArguments()[0]); errors = new BeanPropertyBindingResult(tb, "tb"); ValidationUtils.rejectIfEmpty(errors, "name", "EMPTY_OR_WHITESPACE", new Object[] {"arg"}, "msg"); assertTrue(errors.hasFieldErrors("name")); assertEquals("EMPTY_OR_WHITESPACE", errors.getFieldError("name").getCode()); assertEquals("arg", errors.getFieldError("name").getArguments()[0]); assertEquals("msg", errors.getFieldError("name").getDefaultMessage()); }
@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 public void testValidationUtilsEmptyOrWhitespaceVariants() { TestBean tb = new TestBean(); tb.setName(" "); Errors errors = new BeanPropertyBindingResult(tb, "tb"); ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "EMPTY_OR_WHITESPACE", new Object[] {"arg"}); assertTrue(errors.hasFieldErrors("name")); assertEquals("EMPTY_OR_WHITESPACE", errors.getFieldError("name").getCode()); assertEquals("arg", errors.getFieldError("name").getArguments()[0]); errors = new BeanPropertyBindingResult(tb, "tb"); ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "EMPTY_OR_WHITESPACE", new Object[] {"arg"}, "msg"); assertTrue(errors.hasFieldErrors("name")); assertEquals("EMPTY_OR_WHITESPACE", errors.getFieldError("name").getCode()); assertEquals("arg", errors.getFieldError("name").getArguments()[0]); assertEquals("msg", errors.getFieldError("name").getDefaultMessage()); }
@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 public void testValidatorWithNestedObjectNull() { TestBean tb = new TestBean(); Errors errors = new BeanPropertyBindingResult(tb, "tb"); Validator testValidator = new TestBeanValidator(); testValidator.validate(tb, errors); errors.setNestedPath("spouse."); assertEquals("spouse.", errors.getNestedPath()); Validator spouseValidator = new SpouseValidator(); spouseValidator.validate(tb.getSpouse(), errors); errors.setNestedPath(""); assertTrue(errors.hasFieldErrors("spouse")); assertEquals(1, errors.getFieldErrorCount("spouse")); assertEquals("SPOUSE_NOT_AVAILABLE", errors.getFieldError("spouse").getCode()); assertEquals("tb", (errors.getFieldErrors("spouse").get(0)).getObjectName()); assertEquals(null, (errors.getFieldErrors("spouse").get(0)).getRejectedValue()); }
@Test public void testBindingErrorWithCustomFormatter() { TestBean tb = new TestBean(); DataBinder binder = new DataBinder(tb); binder.addCustomFormatter(new NumberStyleFormatter()); MutablePropertyValues pvs = new MutablePropertyValues(); pvs.add("myFloat", "1x2"); LocaleContextHolder.setLocale(Locale.GERMAN); try { binder.bind(pvs); assertEquals(new Float(0.0), tb.getMyFloat()); assertEquals("1x2", binder.getBindingResult().getFieldValue("myFloat")); assertTrue(binder.getBindingResult().hasFieldErrors("myFloat")); assertEquals("typeMismatch", binder.getBindingResult().getFieldError("myFloat").getCode()); } finally { LocaleContextHolder.resetLocaleContext(); } }
@Test public void testBindingWithRequiredMapFields() { TestBean tb = new TestBean(); tb.setSpouse(new TestBean()); DataBinder binder = new DataBinder(tb, "person"); binder.setRequiredFields("someMap[key1]", "someMap[key2]", "someMap['key3']", "someMap[key4]"); MutablePropertyValues pvs = new MutablePropertyValues(); pvs.add("someMap[key1]", "value1"); pvs.add("someMap['key2']", "value2"); pvs.add("someMap[key3]", "value3"); binder.bind(pvs); BindingResult br = binder.getBindingResult(); assertEquals("Wrong number of errors", 1, br.getErrorCount()); assertEquals("required", br.getFieldError("someMap[key4]").getCode()); }
@Test public void testBindingErrorWithRuntimeExceptionFromCustomFormatter() { TestBean tb = new TestBean(); DataBinder binder = new DataBinder(tb); binder.addCustomFormatter(new Formatter<String>() { @Override public String parse(String text, Locale locale) throws ParseException { throw new RuntimeException(text); } @Override public String print(String object, Locale locale) { return object; } }); MutablePropertyValues pvs = new MutablePropertyValues(); pvs.add("name", "test"); binder.bind(pvs); assertTrue(binder.getBindingResult().hasFieldErrors("name")); assertEquals("test", binder.getBindingResult().getFieldValue("name")); assertEquals("typeMismatch", binder.getBindingResult().getFieldError("name").getCode()); }