message.properties의 모든 key를 가져올 수 있는 방법이 있나요?

979 views
Skip to first unread message

jace dev

unread,
Apr 6, 2011, 6:22:23 AM4/6/11
to Korea Spring User Group
먼저 항상 알찬 지식을 공유해주시는 KSUG 회원님들께 감사에 말씀드립니다.

spring의 MessageSource를 통해서 Locale에 따라 선택된
message properties의 모든 key값을 가져올 수 있는 방법이 있을까요?

저의 경우 bean에 정의된 messageSource의 대상 클래스를
ReloadableResourceBundleMessageSource로 선언해서 사용하고 있습니다.

위 클래스에 구현된 함수중
1. getMergedProperties(Locale locale)
2. getProperties(String basename)
을 테스트 해보았습니다.

1번의 경우 spring의 Locale Resolver를 통해서 설정된 Locale과는 상관없이 결과값이 나타났습니다.
선언된 message properties을 merge한 값을 취할 수 있었습니다.
2번의 경우 basename을 이렇게 저렇게 빠꿔봤지만 properties 파일을 찾질 못했습니다.
( 저의 경우 properties파일이 classes밑에 존재하지 않고 WEB-INF/config 하위에 존재합니다.)

어떻게 하면 Locale Resolver를 통해서 설정(선택)된 message properties의 모든 key값을 얻을
수 있을까요?


Sungchul Park

unread,
Apr 6, 2011, 8:00:14 AM4/6/11
to ks...@googlegroups.com

> 1번의 경우 spring의 Locale Resolver를 통해서 설정된 Locale과는 상관없이 결과값이 나타났습니다.
> 선언된 message properties을 merge한 값을 취할 수 있었습니다.
ReloadableResourceBundleMessageSource의 getMergedProperties()가 원하시는
것 맞는 듯한데 Locale과 상관 없다는 게 어떤 뜻인가요?
LocaleResolver.resolveLocale()로 얻어낸 로케일로 getMergedProperties()를
호출해도 다른 결과가 반환 된다는 건가요?

지금 원하시는 게 머지한 메시지가 아니라 특정 로케일에 해당하는 메시지 파
일에 정의된 키 값만인 건가요?

> 2번의 경우 basename을 이렇게 저렇게 빠꿔봤지만 properties 파일을 찾질 못했습니다.
> ( 저의 경우 properties파일이 classes밑에 존재하지 않고 WEB-INF/config 하위에 존재합니다.)

getProperties()의 인자로 넘길 값은 basename이 아니라 filename 같은데 아닌가요?


> 어떻게 하면 Locale Resolver를 통해서 설정(선택)된 message properties의 모든 key값을 얻을
> 수 있을까요?

만약 특정 로케일용으로만 정의된 메시지의 키 값을 얻으시겠다면
calculateFilenamesForLocale()를 호출해서 얻어진 파일들을 직접 읽어 추출
하시면 될 듯 합니다. ReloadableResourceBundleMessageSource의
getProperties()를 사용하셔도 되고요.

jace dev

unread,
Apr 6, 2011, 8:39:21 PM4/6/11
to Korea Spring User Group
getMergedProperties 메소드의 경우 선언된 모든 message properties의 값을 머지하는것으로 알고 있는

사용자의 로케일과는 상관없이 ko_KR 의 message properties 값을 반환하더군요.
(다만 사용자의 locale과 일치하는 message properties의 key가 다른 locale의 message
properties 에 없는 경우는 Exception 이 발생했었음)

getProperties() 의 경우는
filename으로 /WEB-INF 를 포함한 경로 또는 물리적 파일 전체 경로를 인자로 넘겨도 해당 파일을 찾지 못했었습니
다.

말씀해주신 calculateFilenamesForLocale() 로 다시한번 테스트 해봐야 겠습니다.

답변 감사드립니다.

혹시 다른 좋은 방법 있으시면 답변 부탁드릴께요...

오늘도 행복한 하루 보내세요.

심상호

unread,
Apr 6, 2011, 9:23:47 PM4/6/11
to ks...@googlegroups.com
Debugging 해보니 ReloadableResourceBundleMessageSource의
protected List<String> calculateAllFilenames(String basename, Locale locale)
method 에 bug가 있는 듯 합니다. (3.0.5.RELEASE)
 
'fallbackToSystemLocale' property가 true인 경우, locale에 해당하는 file이 없을 경우 system locale을 사용한다고 설명되어 있는데 check logic 상에서는 해당 file이 없는지 여부를 검사하지 않네요.
그래서 system locale이 ko 이고 en 으로 getMergedProperties 를 호출하는 경우, file을 찾는 순서상 en->ko->basename 순으로 merge하기 때문에 ko에 해당하는 properties가 return되는 듯 합니다.
 
우선은 원하시는 결과를 얻으시려면 'fallbackToSystemLocale' 값을 false로 두고 getMergedProperties를 사용해보시면 될 듯 합니다. 

심상호

unread,
Apr 6, 2011, 9:28:48 PM4/6/11
to ks...@googlegroups.com
아. merge 순서는 basename -> ko -> en 입니다.
가져온 file을 역순으로 merge 합니다.
 
아무래도 구현하려고 했던 기능은 해당 locale에 없는 code인 경우 system locale의 값을 가져오려고 한 듯 한데, Javadoc 설명이랑 조금 다른 것 같습니다.

jace dev

unread,
Apr 7, 2011, 11:49:36 PM4/7/11
to Korea Spring User Group
오호 심상호님 친절한 답변 감사드립니다.
Reply all
Reply to author
Forward
0 new messages