• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

MessageSource 구현체

20.03.04 06:19 작성 조회수 228

0

안녕하세요.

MessageSource 구현체를 강의에서 사용한 ReloadableResourceBundleMessageSource가 아닌 ResourceBundleMessageSource를 사용하면 왜 NoSuchMessageException이 날까요?

@Bean
public MessageSource messageSource() {
var messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasenames("classpath:/messages");

return messageSource;
}

강의에서 처럼 이렇게 빈을 등록해주면 정상적으로 메시지가 출력되는데

var messageSource = new ResourceBundleMessageSource();

이렇게 구현체를 바꾸기만 하면 NoSuchMessageException이 나네요

왜 프로퍼티에서 메시지를 못읽는건지 궁금합니다

감사합니다.

-----------------------------------------

이것저것 해보다가 해결 방법은 찾았습니다.

@Bean
public MessageSource messageSource() {
var messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("messages");

return messageSource;
}

setBasenames()에 저렇게 넘겨주면 메시지가 정상적으로 출력이 되더라구요

왜 ReloadableResourceBundleMessageSource를 사용할때와 달리 classpath:/를 붙이면 안되는건가요?

답변 1

답변을 작성해보세요.

1

좋은 질문이네요. 아마도 관련 클래스들 JavaDoc을 읽어보셨다면 이해하셨을텐데요. 질문하신 내용이 맞습니다.

setBasename은 구현체에 따라 다르게 동작한다고 나와있고 Reloadable구현체는 classpath:/와 같은 프리픽스를 지원하지만 다른건 지원하지 않습니다.

The resource location format is up to the specific {@code MessageSource} implementation.
> AbstractResourceBasedMessageSource.java

Note that the basenames set as {@link #setBasenames "basenames"} property are treated in a slightly different fashion than the "basenames" property of {@link ResourceBundleMessageSource}. It follows the basic ResourceBundle rule of not specifying file extension or language codes, but can refer to any Spring resource location (instead of being restricted to classpath resources).
> ReloadableResourceBundleMessageSource.java