4

既存の Java/JSF Web サイトがあります。画面上のすべてのテキストは、applicaltion.properties からテキストを取得する <f:loadBundle basename="org.example.applicaltion" var="applicaltion" /> を介してプロパティ ファイルから取得されます。

これらの実行時に構成可能なサブセットについては、他の場所 (Web サービス経由の CMS) から文字列を取得したいと考えています。ResourceBundle クラスを見ると、親 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 とは別の名前を付けてから、CustomResourceBundle.handleGetObject(key) 内から ResourceBundle.getBundle(PROPERTY_FILE_NAME).getString(key) のフル スタックを委任するというあまり魅力的ではないオプションを検討しています。

より良いアイデアはありますか?

4

2 に答える 2

2

オーバーライド値があるかどうかを確認し、それを返す場合は、標準のリソースバンドルに委任することで、これを解決することになりました。

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ローダーは再帰的になりません。

于 2009-03-18T09:41:09.810 に答える
0

カスタム PropertyResolver を作成し、プロパティ値をどこから取得するかのロジックを実行させることができます。

たとえば、呼び出される Bean を定義して、それがmessageSourceapplication.properties に加えて、CMS プロパティなどをロードするようにすることができます。

次に、カスタムを作成し(ここPropertyResolverに Spring の MessageSource でこれを行う方法の例があります)、次のようなものを使用してそれをリンクします。faces-config.xml

<application>  
<property-resolver>  
      com.package.MessageSourcePropertyResolver  
   </property-resolver>  
</application>   
于 2009-03-17T10:59:06.173 に答える