1.1.5버전에서 message source가 필수가 되면서 나오는 문제를 해결하기 위한 Spring포럼에 올라온 글#

http://forum.springframework.org/viewtopic.php?t=4328&highlight=message

나는 Springs validation패키지를 사용하는 웹 애플리케이션을 가지고 있다. 나는 다음 예제처럼 ValidationUtils.rejectIfEmtpy메소드에 인자를 사용하는 디폴트 에러메시지를 사용하더라도 Spring 1.1.5에서 messageSource를 명시하지 않는다면 에러가 발생할것이라고 예고했었다.

Code:

ValidationUtils.rejectIfEmpty(errors, "password", PASSWORD_REQUIRED", "Password is required."); 

1.1.4에서는 어떠한 예외도 없었고 명시하지 않더라도 기대되는 대로 모든것이 잘 작동했다. 하지만 지금은 다음과 같은 예외 에러를 보게된다.

Quote: <pre>

org.springframework.context.NoSuchMessageException: No message found under code 'PASSWORD_REQUIRED.userForm.userAccount.password' for locale 'en_US'. at org.springframework.context.support.DelegatingMessageSource.getMessage(DelegatingMessageSource.java:73) at org.springframework.context.support.DelegatingMessageSource.getMessage(DelegatingMessageSource.java:6 at org.springframework.context.support.AbstractApplicationContext.getMessage(AbstractApplicationContext.java:594) at org.springframework.web.servlet.support.RequestContext.getMessage(RequestContext.java:492) at org.springframework.web.servlet.support.BindStatus.getErrorMessages(BindStatus.java:171) at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:128) at org.springframework.web.servlet.tags.BindStatus.<init>(BindStatus.java:3 at org.springframework.web.servlet.tags.BindTag.doStartTagInternal(BindTag.java:105) at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:70) ... </pre>

DelegatingMessageSource내의 마지막 메소드를 본 후에..

Code:

   public String getMessage(MessageSourceResolvable resolvable, Locale locale
      throws NoSuchMessageException 
      if (this.parentMessageSource != null) { 
         return this.parentMessageSource.getMessage(resolvable, locale)
      
      else 
         String[] codes = resolvable.getCodes()
         String code = (codes != null && codes.length > ? codes[0null)
         throw new NoSuchMessageException(code, locale)
      
   

나는 만약 그것의 parentMessageSource가 null이라면 전달되는 분석가능한 객체로부터 defaultMessage를 얻을수 없다는것을 알았다. (나는 jdk1.4.2와 톰캣 5.0.28에서 수행중이고 AbstractApplicationContext내의 getInternalParentMessageSource()메소드가 초기화중에 null을 반환해야만 한다는것처럼 본다.). 그래서 나는 다음처럼 변경한다.

Code:

   public String getMessage(MessageSourceResolvable resolvable, Locale localethrows NoSuchMessageException 
      if (this.parentMessageSource != null) { 
         return this.parentMessageSource.getMessage(resolvable, locale)
      
      else 
         String msg = resolvable.getDefaultMessage()
         if (StringUtils.hasText(msg)) { 
            return msg; 
         else 
            String[] codes = resolvable.getCodes()
            String code = (codes != null && codes.length > ? codes[0null)
            throw new NoSuchMessageException(code, locale)
         
      
   

만약 디폴트 messageSource가 명시되지 않는다면 당신은 최소한 디폴트 에러메시지를 얻을수 있다. 만약에 그 디폴트 에러메시지가 존재할때만 그렇게 된다.

나는 릴리즈노트에서 messageSource가 필요하다는것에 대한 어떤것도 보지 않았다. 하지만 나는 같은것이나 어떤 동의할수 있는것을 언급할것이다.

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-1) was last changed on 06-Apr-2006 09:45 by UnknownAuthor