@Override public boolean equals(@Nullable Object other) { if (this == other) { return true; } if (!super.equals(other)) { return false; } FieldError otherError = (FieldError) other; return (getField().equals(otherError.getField()) && ObjectUtils.nullSafeEquals(getRejectedValue(), otherError.getRejectedValue()) && isBindingFailure() == otherError.isBindingFailure()); }
@Override public boolean equals(@Nullable Object other) { if (this == other) { return true; } if (!super.equals(other)) { return false; } FieldError otherError = (FieldError) other; return (getField().equals(otherError.getField()) && ObjectUtils.nullSafeEquals(getRejectedValue(), otherError.getRejectedValue()) && isBindingFailure() == otherError.isBindingFailure()); }
@Override public int hashCode() { int hashCode = super.hashCode(); hashCode = 29 * hashCode + getField().hashCode(); hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(getRejectedValue()); hashCode = 29 * hashCode + (isBindingFailure() ? 1 : 0); return hashCode; }
@Override public int hashCode() { int hashCode = super.hashCode(); hashCode = 29 * hashCode + getField().hashCode(); hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(getRejectedValue()); hashCode = 29 * hashCode + (isBindingFailure() ? 1 : 0); return hashCode; }
@Override @Nullable public Object getFieldValue(String field) { FieldError fieldError = getFieldError(field); // Use rejected value in case of error, current field value otherwise. if (fieldError != null) { Object value = fieldError.getRejectedValue(); // Do not apply formatting on binding failures like type mismatches. return (fieldError.isBindingFailure() || getTarget() == null ? value : formatFieldValue(field, value)); } else if (getTarget() != null) { Object value = getActualFieldValue(fixedField(field)); return formatFieldValue(field, value); } else { return this.fieldValues.get(field); } }
@RequestMapping("/myPath.do") public String myHandle(@ModelAttribute("myCommand") TestBean tb, BindingResult errors, ModelMap model) { FieldError error = errors.getFieldError("age"); assertNotNull("Must have field error for age property", error); assertEquals("value2", error.getRejectedValue()); if (!model.containsKey("myKey")) { model.addAttribute("myKey", "myValue"); } return "myView"; } }
@RequestMapping("/myPath.do") public String myHandle(@ModelAttribute(name="myCommand", binding=true) TestBean tb, BindingResult errors, ModelMap model) { FieldError error = errors.getFieldError("age"); assertNotNull("Must have field error for age property", error); assertEquals("value2", error.getRejectedValue()); if (!model.containsKey("myKey")) { model.addAttribute("myKey", "myValue"); } return "myView"; } }
@Override @Nullable public Object getFieldValue(String field) { FieldError fieldError = getFieldError(field); // Use rejected value in case of error, current field value otherwise. if (fieldError != null) { Object value = fieldError.getRejectedValue(); // Do not apply formatting on binding failures like type mismatches. return (fieldError.isBindingFailure() || getTarget() == null ? value : formatFieldValue(field, value)); } else if (getTarget() != null) { Object value = getActualFieldValue(fixedField(field)); return formatFieldValue(field, value); } else { return this.fieldValues.get(field); } }
@SuppressWarnings("unchecked") @Nullable private <T extends ObjectError> T escapeObjectError(@Nullable T source) { if (source == null) { return null; } String defaultMessage = source.getDefaultMessage(); if (defaultMessage != null) { defaultMessage = HtmlUtils.htmlEscape(defaultMessage); } if (source instanceof FieldError) { FieldError fieldError = (FieldError) source; Object value = fieldError.getRejectedValue(); if (value instanceof String) { value = HtmlUtils.htmlEscape((String) value); } return (T) new FieldError( fieldError.getObjectName(), fieldError.getField(), value, fieldError.isBindingFailure(), fieldError.getCodes(), fieldError.getArguments(), defaultMessage); } else { return (T) new ObjectError( source.getObjectName(), source.getCodes(), source.getArguments(), defaultMessage); } }
@Test public void testSpringValidationFieldType() { LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); validator.afterPropertiesSet(); ValidPerson person = new ValidPerson(); person.setName("Phil"); person.getAddress().setStreet("Phil's Street"); BeanPropertyBindingResult errors = new BeanPropertyBindingResult(person, "person"); validator.validate(person, errors); assertEquals(1, errors.getErrorCount()); assertThat("Field/Value type mismatch", errors.getFieldError("address").getRejectedValue(), instanceOf(ValidAddress.class)); }
@Test public void testSpringValidationFieldType() { LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); validator.afterPropertiesSet(); ValidPerson person = new ValidPerson(); person.setName("Phil"); person.getAddress().setStreet("Phil's Street"); BeanPropertyBindingResult errors = new BeanPropertyBindingResult(person, "person"); validator.validate(person, errors); assertEquals(1, errors.getErrorCount()); assertThat("Field/Value type mismatch", errors.getFieldError("address").getRejectedValue(), instanceOf(ValidAddress.class)); }
assertTrue("Correct number of age errors", br.getFieldErrorCount("age") == 1); assertEquals("32x", binder.getBindingResult().getFieldValue("age")); assertEquals("32x", binder.getBindingResult().getFieldError("age").getRejectedValue()); assertEquals(0, tb.getAge());
@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()); }
assertTrue("Correct number of age errors", br.getFieldErrorCount("age") == 1); assertEquals("32x", binder.getBindingResult().getFieldValue("age")); assertEquals("32x", binder.getBindingResult().getFieldError("age").getRejectedValue()); assertEquals(0, tb.getAge());
assertEquals("tb", (errors.getFieldErrors("age").get(0)).getObjectName()); assertEquals("age", (errors.getFieldErrors("age").get(0)).getField()); assertEquals(new Integer(0), (errors.getFieldErrors("age").get(0)).getRejectedValue()); assertEquals("AGE_NOT_ODD", (errors.getFieldErrors("age").get(1)).getCode()); assertEquals("NOT_ROD", errors.getFieldError("name").getCodes()[3]); assertEquals("name", (errors.getFieldErrors("name").get(0)).getField()); assertEquals(null, (errors.getFieldErrors("name").get(0)).getRejectedValue()); assertEquals("TOO_YOUNG", errors.getFieldError("spouse.age").getCode()); assertEquals("tb", (errors.getFieldErrors("spouse.age").get(0)).getObjectName()); assertEquals(new Integer(0), (errors.getFieldErrors("spouse.age").get(0)).getRejectedValue());
assertEquals("tb", (errors.getFieldErrors("age").get(0)).getObjectName()); assertEquals("age", (errors.getFieldErrors("age").get(0)).getField()); assertEquals(new Integer(0), (errors.getFieldErrors("age").get(0)).getRejectedValue()); assertEquals("validation.AGE_NOT_ODD", (errors.getFieldErrors("age").get(1)).getCode()); assertEquals("validation.NOT_ROD", errors.getFieldError("name").getCodes()[3]); assertEquals("name", (errors.getFieldErrors("name").get(0)).getField()); assertEquals(null, (errors.getFieldErrors("name").get(0)).getRejectedValue()); assertEquals("validation.TOO_YOUNG", errors.getFieldError("spouse.age").getCode()); assertEquals("tb", (errors.getFieldErrors("spouse.age").get(0)).getObjectName()); assertEquals(new Integer(0), (errors.getFieldErrors("spouse.age").get(0)).getRejectedValue());
@Test public void testCustomFormatterForAllStringProperties() { TestBean tb = new TestBean(); DataBinder binder = new DataBinder(tb, "tb"); binder.addCustomFormatter(new Formatter<String>() { @Override public String parse(String text, Locale locale) throws ParseException { return "prefix" + text; } @Override public String print(String object, Locale locale) { return object.substring(6); } }); MutablePropertyValues pvs = new MutablePropertyValues(); pvs.add("name", "value"); pvs.add("touchy", "value"); binder.bind(pvs); binder.getBindingResult().rejectValue("name", "someCode", "someMessage"); binder.getBindingResult().rejectValue("touchy", "someCode", "someMessage"); assertEquals("value", binder.getBindingResult().getFieldValue("name")); assertEquals("prefixvalue", binder.getBindingResult().getFieldError("name").getRejectedValue()); assertEquals("prefixvalue", tb.getName()); assertEquals("value", binder.getBindingResult().getFieldValue("touchy")); assertEquals("prefixvalue", binder.getBindingResult().getFieldError("touchy").getRejectedValue()); assertEquals("prefixvalue", tb.getTouchy()); }
@Test public void testCustomEditorForAllStringProperties() { TestBean tb = new TestBean(); DataBinder binder = new DataBinder(tb, "tb"); binder.registerCustomEditor(String.class, null, new PropertyEditorSupport() { @Override public void setAsText(String text) throws IllegalArgumentException { setValue("prefix" + text); } @Override public String getAsText() { return ((String) getValue()).substring(6); } }); MutablePropertyValues pvs = new MutablePropertyValues(); pvs.add("name", "value"); pvs.add("touchy", "value"); binder.bind(pvs); binder.getBindingResult().rejectValue("name", "someCode", "someMessage"); binder.getBindingResult().rejectValue("touchy", "someCode", "someMessage"); assertEquals("value", binder.getBindingResult().getFieldValue("name")); assertEquals("prefixvalue", binder.getBindingResult().getFieldError("name").getRejectedValue()); assertEquals("prefixvalue", tb.getName()); assertEquals("value", binder.getBindingResult().getFieldValue("touchy")); assertEquals("prefixvalue", binder.getBindingResult().getFieldError("touchy").getRejectedValue()); assertEquals("prefixvalue", tb.getTouchy()); }
assertEquals("prefixvalue", binder.getBindingResult().getFieldError("name").getRejectedValue()); assertEquals("prefixvalue", tb.getName()); assertEquals("value", binder.getBindingResult().getFieldValue("touchy")); assertEquals("value", binder.getBindingResult().getFieldError("touchy").getRejectedValue()); assertEquals("value", tb.getTouchy());
assertEquals("prefixvalue", binder.getBindingResult().getFieldError("name").getRejectedValue()); assertEquals("prefixvalue", tb.getName()); assertEquals("value", binder.getBindingResult().getFieldValue("touchy")); assertEquals("value", binder.getBindingResult().getFieldError("touchy").getRejectedValue()); assertEquals("value", tb.getTouchy());