문제

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>   
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top