Spring에서 제공하는 Field Type, 프로그래머가 직접 작성한 FieldError, ObjectError를 한데 묶어(List) Model에 주입시켜주는 통합 인터페이스이다.
Model에 주입이 되어 Thymeleaf 같은 뷰 템플릿에 넘겨주어서 사용할 수 있으며, addError 메서드를 통해 프로그래머가 직접 작성한 에러 메시지를 넣을 수 있게 기능을 지원한다.
Spring에서 기본적으로 사용하는 구현체는 BeanPropertyBindingResult
이다.
package org.springframework.validation;
public interface BindingResult extends Errors {
// ...
private final List<ObjectError> errors = new ArrayList<>();
// ...
void addError(ObjectError error);
// ...
}
addError()
등, 추가적인 기능을 제공한다.BeanPropertyBindingResult
구현체를 기본으로 주입한다.@RequestParam
, @ModelAttribute
에서 바인딩 에러가 발생하는 경우,public class ObjectError extends DefaultMessageSourceResolvable {
public ObjectError(
String objectName,
String defaultMessage
) {
this(objectName, null, null, defaultMessage);
}
public ObjectError(
String objectName,
@Nullable String[] codes,
@Nullable Object[] arguments,
@Nullable String defaultMessage
) {
super(codes, arguments, defaultMessage);
Assert.notNull(objectName, "Object name must not be null");
this.objectName = objectName;
}
}
String objectName
${objectName}
@Nullable String defaultMessage
@Nullable String[] codes
errors.properties
에서 key 값를 찾는다.@Nullable Object[] arguments
errors.properties
에서 찾은 value 값의 인자({0}
, {1}
)를 전달한다.public class FieldError extends ObjectError {
public FieldError(
String objectName,
String field,
String defaultMessage
) {
this(objectName, field, null, false, null, null, defaultMessage);
}
public FieldError(
String objectName,
String field,
@Nullable Object rejectedValue,
boolean bindingFailure,
@Nullable String[] codes,
@Nullable Object[] arguments,
@Nullable String defaultMessage
) {
super(objectName, codes, arguments, defaultMessage);
Assert.notNull(field, "Field must not be null");
this.field = field;
this.rejectedValue = rejectedValue;
this.bindingFailure = bindingFailure;
}
}
String field
${objectName.field}
@Nullable Object rejectedValue
boolean bindingFailure
<div th:if="${#fields.hasGlobalErrors()}">
<p th:each="err : ${#fields.globalErrors()}" th:text="${err}"></p>
</div>
<div class="form-control" th:errorclass="field-error"></div>
<div th:errors="${objectName.field}"></div>
${#fields}
th:errors
th:if
의 편의 버전이다.th:errorclass