/** * Check whether the given FieldError matches the given field. * @param field the field that we are looking up FieldErrors for * @param fieldError the candidate FieldError * @return whether the FieldError matches the given field */ protected boolean isMatchingFieldError(String field, FieldError fieldError) { if (field.equals(fieldError.getField())) { return true; } // Optimization: use charAt and regionMatches instead of endsWith and startsWith (SPR-11304) int endIndex = field.length() - 1; return (endIndex >= 0 && field.charAt(endIndex) == '*' && (endIndex == 0 || field.regionMatches(0, fieldError.getField(), 0, endIndex))); }
/** * Check whether the given FieldError matches the given field. * @param field the field that we are looking up FieldErrors for * @param fieldError the candidate FieldError * @return whether the FieldError matches the given field */ protected boolean isMatchingFieldError(String field, FieldError fieldError) { if (field.equals(fieldError.getField())) { return true; } // Optimization: use charAt and regionMatches instead of endsWith and startsWith (SPR-11304) int endIndex = field.length() - 1; return (endIndex >= 0 && field.charAt(endIndex) == '*' && (endIndex == 0 || field.regionMatches(0, fieldError.getField(), 0, endIndex))); }
@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()); }
private String extractFieldName(FieldError err) { String fieldExpression = err.getField(); String fieldName = StringUtil.extractFieldNameFromExpression(fieldExpression); return fieldName; }
@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 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; }
@ExceptionHandler(MethodArgumentNotValidException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) ResponseMessage handleException(MethodArgumentNotValidException e) { SimpleValidateResults results = new SimpleValidateResults(); e.getBindingResult().getAllErrors() .stream() .filter(FieldError.class::isInstance) .map(FieldError.class::cast) .forEach(fieldError -> results.addResult(fieldError.getField(), fieldError.getDefaultMessage())); return ResponseMessage.error(400, results.getResults().isEmpty() ? e.getMessage() : results.getResults().get(0).getMessage()).result(results.getResults()); }
@ExceptionHandler(BindException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) ResponseMessage handleException(BindException e) { SimpleValidateResults results = new SimpleValidateResults(); e.getBindingResult().getAllErrors() .stream() .filter(FieldError.class::isInstance) .map(FieldError.class::cast) .forEach(fieldError -> results.addResult(fieldError.getField(), fieldError.getDefaultMessage())); return ResponseMessage.error(400, results.getResults().isEmpty() ? e.getMessage() : results.getResults().get(0).getMessage()).result(results.getResults()); }
@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 testSpringValidation() { LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); validator.afterPropertiesSet(); ValidPerson person = new ValidPerson(); BeanPropertyBindingResult result = new BeanPropertyBindingResult(person, "person"); validator.validate(person, result); assertEquals(2, result.getErrorCount()); FieldError fieldError = result.getFieldError("name"); assertEquals("name", fieldError.getField()); List<String> errorCodes = Arrays.asList(fieldError.getCodes()); assertEquals(4, errorCodes.size()); assertTrue(errorCodes.contains("NotNull.person.name")); assertTrue(errorCodes.contains("NotNull.name")); assertTrue(errorCodes.contains("NotNull.java.lang.String")); assertTrue(errorCodes.contains("NotNull")); fieldError = result.getFieldError("address.street"); assertEquals("address.street", fieldError.getField()); errorCodes = Arrays.asList(fieldError.getCodes()); assertEquals(5, errorCodes.size()); assertTrue(errorCodes.contains("NotNull.person.address.street")); assertTrue(errorCodes.contains("NotNull.address.street")); assertTrue(errorCodes.contains("NotNull.street")); assertTrue(errorCodes.contains("NotNull.java.lang.String")); assertTrue(errorCodes.contains("NotNull")); }
@Test public void testSpringValidationWithErrorInListElement() { LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); validator.afterPropertiesSet(); ValidPerson person = new ValidPerson(); person.getAddressList().add(new ValidAddress()); BeanPropertyBindingResult result = new BeanPropertyBindingResult(person, "person"); validator.validate(person, result); assertEquals(3, result.getErrorCount()); FieldError fieldError = result.getFieldError("name"); assertEquals("name", fieldError.getField()); fieldError = result.getFieldError("address.street"); assertEquals("address.street", fieldError.getField()); fieldError = result.getFieldError("addressList[0].street"); assertEquals("addressList[0].street", fieldError.getField()); }
@Test public void testSpringValidation() { LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); validator.afterPropertiesSet(); ValidPerson person = new ValidPerson(); BeanPropertyBindingResult result = new BeanPropertyBindingResult(person, "person"); validator.validate(person, result); assertEquals(2, result.getErrorCount()); FieldError fieldError = result.getFieldError("name"); assertEquals("name", fieldError.getField()); List<String> errorCodes = Arrays.asList(fieldError.getCodes()); assertEquals(4, errorCodes.size()); assertTrue(errorCodes.contains("NotNull.person.name")); assertTrue(errorCodes.contains("NotNull.name")); assertTrue(errorCodes.contains("NotNull.java.lang.String")); assertTrue(errorCodes.contains("NotNull")); fieldError = result.getFieldError("address.street"); assertEquals("address.street", fieldError.getField()); errorCodes = Arrays.asList(fieldError.getCodes()); assertEquals(5, errorCodes.size()); assertTrue(errorCodes.contains("NotNull.person.address.street")); assertTrue(errorCodes.contains("NotNull.address.street")); assertTrue(errorCodes.contains("NotNull.street")); assertTrue(errorCodes.contains("NotNull.java.lang.String")); assertTrue(errorCodes.contains("NotNull")); }
@Test public void testSpringValidationWithErrorInListElement() { LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); validator.afterPropertiesSet(); ValidPerson person = new ValidPerson(); person.getAddressList().add(new ValidAddress()); BeanPropertyBindingResult result = new BeanPropertyBindingResult(person, "person"); validator.validate(person, result); assertEquals(3, result.getErrorCount()); FieldError fieldError = result.getFieldError("name"); assertEquals("name", fieldError.getField()); fieldError = result.getFieldError("address.street"); assertEquals("address.street", fieldError.getField()); fieldError = result.getFieldError("addressList[0].street"); assertEquals("addressList[0].street", fieldError.getField()); }
@Test public void testSpringValidationWithErrorInSetElement() { LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); validator.afterPropertiesSet(); ValidPerson person = new ValidPerson(); person.getAddressSet().add(new ValidAddress()); BeanPropertyBindingResult result = new BeanPropertyBindingResult(person, "person"); validator.validate(person, result); assertEquals(3, result.getErrorCount()); FieldError fieldError = result.getFieldError("name"); assertEquals("name", fieldError.getField()); fieldError = result.getFieldError("address.street"); assertEquals("address.street", fieldError.getField()); fieldError = result.getFieldError("addressSet[].street"); assertEquals("addressSet[].street", fieldError.getField()); }
@Test public void testSpringValidationWithErrorInSetElement() { LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); validator.afterPropertiesSet(); ValidPerson person = new ValidPerson(); person.getAddressSet().add(new ValidAddress()); BeanPropertyBindingResult result = new BeanPropertyBindingResult(person, "person"); validator.validate(person, result); assertEquals(3, result.getErrorCount()); FieldError fieldError = result.getFieldError("name"); assertEquals("name", fieldError.getField()); fieldError = result.getFieldError("address.street"); assertEquals("address.street", fieldError.getField()); fieldError = result.getFieldError("addressSet[].street"); assertEquals("addressSet[].street", fieldError.getField()); }
@Test public void testFieldErrorAccessVariations() { TestBean testBean = new TestBean(); DataBinder binder = new DataBinder(testBean, "testBean"); assertNull(binder.getBindingResult().getGlobalError()); assertNull(binder.getBindingResult().getFieldError()); assertNull(binder.getBindingResult().getFieldError("")); MutablePropertyValues mpv = new MutablePropertyValues(); mpv.add("age", "invalid"); binder.bind(mpv); assertNull(binder.getBindingResult().getGlobalError()); assertNull(binder.getBindingResult().getFieldError("")); assertNull(binder.getBindingResult().getFieldError("b*")); assertEquals("age", binder.getBindingResult().getFieldError().getField()); assertEquals("age", binder.getBindingResult().getFieldError("*").getField()); assertEquals("age", binder.getBindingResult().getFieldError("a*").getField()); assertEquals("age", binder.getBindingResult().getFieldError("ag*").getField()); assertEquals("age", binder.getBindingResult().getFieldError("age").getField()); }
assertEquals("TOO_YOUNG", errors.getFieldError().getCode()); assertEquals("TOO_YOUNG", (errors.getFieldErrors().get(0)).getCode()); assertEquals("age", (errors.getFieldErrors().get(0)).getField()); assertEquals("AGE_NOT_ODD", (errors.getFieldErrors().get(1)).getCode()); assertEquals("age", (errors.getFieldErrors().get(1)).getField()); assertEquals("NOT_ROD", (errors.getFieldErrors().get(2)).getCode()); assertEquals("name", (errors.getFieldErrors().get(2)).getField()); assertEquals("TOO_YOUNG", (errors.getFieldErrors().get(3)).getCode()); assertEquals("spouse.age", (errors.getFieldErrors().get(3)).getField()); assertEquals("TOO_YOUNG", (errors.getFieldErrors("age").get(0)).getCode()); 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.java.lang.String", errors.getFieldError("name").getCodes()[2]); 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("spouse.name", binder.getBindingResult().getFieldError("spouse.*").getField());
assertEquals("spouse.name", binder.getBindingResult().getFieldError("spouse.*").getField());