DataBinder 클래스에서
protected void applyPropertyValues(MutablePropertyValues mpvs) {
try {
this.getPropertyAccessor().setPropertyValues(mpvs, this.isIgnoreUnknownFields(), this.isIgnoreInvalidFields());
} catch (PropertyBatchUpdateException ex) {
for(PropertyAccessException pae : ex.getPropertyAccessExceptions()) {
this.getBindingErrorProcessor().processPropertyAccessException(pae, this.getInternalBindingResult());
}
}
}
오류발생하면서 catch 구문탄다
public void processPropertyAccessException(PropertyAccessException ex, BindingResult bindingResult) {
String field = ex.getPropertyName();
Assert.state(field != null, "No field in exception");
String[] codes = bindingResult.resolveMessageCodes(ex.getErrorCode(), field);
Object[] arguments = this.getArgumentsForBindError(bindingResult.getObjectName(), field);
Object rejectedValue = ex.getValue();
if (ObjectUtils.isArray(rejectedValue)) {
rejectedValue = StringUtils.arrayToCommaDelimitedString(ObjectUtils.toObjectArray(rejectedValue));
}
FieldError error = new FieldError(bindingResult.getObjectName(), field, rejectedValue, true, codes, arguments, ex.getLocalizedMessage());
error.wrap(ex);
bindingResult.addError(error);
}
디버그 모드에서 codes 보면 에러 코드들 볼 수 있음
4개생성
DefaultMessageSourceResolvable 클래스에서
public DefaultMessageSourceResolvable(@Nullable String[] codes, @Nullable Object[] arguments, @Nullable String defaultMessage) {
this.codes = codes;
this.arguments = arguments;
this.defaultMessage = defaultMessage;
}
이 클래스가 코드, 인자목록 기본 메시지를 가지고 있다
타임리프와 연동에서
SpringErrorsTagProcessor 클래스에서
doProcess 메소드
String[] errorMsgs = bindStatus.getErrorMessages();
오류메시지 처리를 한다
private String[] initErrorMessages() throws NoSuchMessageException {
if (this.errorMessages == null) {
if (this.objectErrors != null) {
this.errorMessages = new String[this.objectErrors.size()];
for(int i = 0; i < this.objectErrors.size(); ++i) {
ObjectError error = (ObjectError)this.objectErrors.get(i);
this.errorMessages[i] = this.requestContext.getMessage(error, this.htmlEscape);
}
} else {
this.errorMessages = new String[0];
}
}
return this.errorMessages;
}
public String getMessage(MessageSourceResolvable resolvable, boolean htmlEscape) throws NoSuchMessageException {
String msg = this.getMessageSource().getMessage(resolvable, this.getLocale());
return htmlEscape ? HtmlUtils.htmlEscape(msg) : msg;
}
AbstractApplicationContext에서
public String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException {
return this.getMessageSource().getMessage(resolvable, locale);
}