PropertyResourceBundle에서 일부 리소스를 무시하는 방법
-
19-08-2019 - |
문제
Exsisting Java/JSF 웹 사이트가 있습니다. 화면의 모든 텍스트는 속성 파일에서 나옵니다.u003Cf:loadBundle basename="org.example.applicaltion" var="applicaltion" /> applicaltion.properties에서 텍스트를 가져옵니다.
이들의 런타임 구성 가능한 하위 집합의 경우 다른 곳 (웹 서비스를 통한 CMS)에서 문자열을 가져 오려고합니다. ResourceBundle 클래스를 살펴보면 IT는 부모 ResourceBundle에 대한 대표단과 함께 이와 가까운 정보에 대한 인위기를 갖는 것을 알 수 없습니다.
나는 이런 식으로 소 메스를 원합니다
public class Applicaltion extends ResourceBundle{
@Override
protected Object handleGetObject(String key) {
if(overridenKey(key)){
return overridedValue(key);
}
return null; // ResourceBundle.getObject will delegate to parent
// if we return null
}
}
나는 이것을 시도했고 부모는 null입니다. 이것이 기본값 -> en-> en_gb의 경우에 더 많이 사용된다고 가정합니다.
속성 파일에 사용자 정의 ResourceBundle과 다른 이름을 갖는 것은 그다지 매력적이지 않은 옵션을 고려한 다음 ResourceBundle.getBundle (property_file_name) .getString (key)의 전체 스택을 통해 위임합니다.
더 나은 아이디어가 있습니까?
해결책
나는 우리가 그것을 반환했다면, 우리가 그것을 반환했다면, 그렇지 않으면 표준 리소스 번들에 위임하는 경우, 우리가 재정의 가치가 있는지 확인함으로써 이것을 해결하게되었습니다.
public class UILabels extends ResourceBundle {
private ResourceBundle getFileResources(){
return ResourceBundle.getBundle("com.example.web.UILabelsFile", this.getLocale());
}
public Enumeration<String> getKeys() {
return getFileResources().getKeys();
}
protected Object handleGetObject(String key) {
if(overrideValue(key)){
return getOverridenValue(key);
}
return getFileResources().getObject(key);
}
}
참고 이름 클래스의 약간의 차이는 모든 클라이언트가 파일을 사용하는 UILABELS입니다.이 파일은 uilabelsfile이므로 ResourceBundle 로더가 재귀하지 않습니다.
다른 팁
사용자 정의 PropertyResolver를 작성한 다음 속성 값을 어디에서 가져올 위치의 논리를 수행하도록 할 수 있습니다.
예를 들어, 콩을 정의 할 수 있습니다 messageSource
Application.properties와 CMS 속성 또는 가지고있는 모든 것을로드하십시오.
그런 다음 관습을 작성하십시오 PropertyResolver
(Spring 's Messagesource 로이 작업을 수행하는 방법의 예가 있습니다. 여기)) 그리고 그것을 당신에게 연결하십시오 faces-config.xml
다음과 같은 것을 사용합니다.
<application>
<property-resolver>
com.package.MessageSourcePropertyResolver
</property-resolver>
</application>