BindingResult에서 MessageSource연동

tokkaiiii·2025년 5월 6일

spring-mvc

목록 보기
20/27

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);
  }
profile
풀스택 자바 개발자입니다

0개의 댓글