2009-03-17 11 views
2

私は既存のJava/JSF Webサイトを持っています。画面上のすべてのテキストは、<によってプロパティファイルから取得されています。f:loadBundle basename = "org.example.applicaltion" var = "applicaltion"/>はapplicaltion.propertiesからテキストをプルします。PropertyResourceBundleからリソースをオーバーライドする方法

これらの実行時設定可能なサブセットについては、他の場所から文字列を引き出したいと思っています(Webサービス経由のCMS)。 ResourceBundleクラスを見ると、親ResourceBundleへの委譲によって、これに近いもののためのインフラストラクチャを持つことができます。私はこれを試してみましたし、親がnullの場合、この

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 
} 
} 

ようsomethisを望んでいます

、私はこれがデフォルトの場合のために、より使用されていると仮定し - >アン - >表すen_GB。

プロパティファイルにカスタムresourceBundleとは異なる名前を付け、次にCustomResourceBundle.handleGetObject内のResourceBundle.getBundle(PROPERTY_FILE_NAME).getString(key)の完全なスタックを委任するという魅力的でないオプションを検討しています)。

もっと良いアイデアを教えてください。

+0

私はまだこれに対するより良い答えを探しています。私が行進の終わりまでにより良い応答を得なければ、自分の答えを受け入れます。 –

答えて

1

次にカスタムを書く(SpringのMessageSource hereでこれを行う方法の例があります)、このようなものを使用してfaces-config.xmlにそれをリンクします我々は、標準のリソースバンドルに委譲する他、名前のクラスのわずかな違いは、すべてのクライアントは、Fを使用する何であるUILabelsある

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); 
} 

} 

注ことを返した場合、我々は、オーバーライド値を持っていましたileはUILabelsFileであるため、ResourceBundleローダーは再帰的に移動しません。

0

カスタムPropertyResolverを記述して、そこからプロパティ値を取得する場所のロジックを実行できます。

たとえば、messageSourceという名前のBeanを定義し、そのアプリケーションのアップロードに加えて、あなたのCMSのプロパティまたはその他のものを持たせることができます。私はかどうかをチェックすることでこれを解決することになった

<application> 
<property-resolver> 
     com.package.MessageSourcePropertyResolver 
    </property-resolver> 
</application> 
+0

アイデアをありがとうが、私はf:loadBundleを介して提供されている既存のリソースの読み込みを変更し、プロパティの解決を変更することには遠慮しています。私はすでに、問題のようにResrouceBundleを拡張することでプログラム的なコントロールを得ることができます。 –

関連する問題