2009-03-17 12 views
2

Ich habe eine bestehende Java/JSF-Website der gesamte Text auf dem Bildschirm stammt aus Property-Dateien über < f: loadBundle basename = "org.example.applicationtion" var = "application"/>, die den Text aus application.properties zieht.So überschreiben Sie einige Ressourcen von einem PropertyResourceBundle

Für eine Laufzeit konfigurierbare Untermenge von diesen möchte ich die Zeichenfolge von wo sonst ziehen (CMS über Web-Services). Wenn man sich die ResourceBundle-Klasse anschaut, scheint es, als hätte man einen Infrastruktor für etwas, das diesem nahe kommt, mit Delegierung an einen übergeordneten ResourceBundle.

Ich wünsche somethis wie diese

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

habe ich versucht, diese und Eltern ist null, ich nehme an, dies für den Fall des Ausfalls mehr verwendet -> de -> de_DE.

Ich erwäge die nicht sehr ansprechende Option, die Eigenschaftsdatei einen anderen Namen als das benutzerdefinierte resourceBundle zu haben und dann über den gesamten Stack von ResourceBundle.getBundle (PROPERTY_FILE_NAME) .getString (key) aus CustomResourceBundle.handleGetObject (key).

Irgendwelche besseren Ideen?

+0

Ich bin immer noch auf der Suche nach einer besseren Antwort, ich werde meine eigene Antwort akzeptieren, wenn ich bis Ende März keine bessere Antwort bekomme. –

Antwort

1

ich das am Ende die Lösung durch, wenn die Überprüfung wir hatten einen Umgehungswert, wenn wir das haben zurückkehren, sonst auf das Standardressourcenpaket zu delegieren

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

} 

Hinweis der geringe Unterschied in Namensklasse ist UILabels das ist, was alle Clients die f verwenden ile ist UILabelsFile, daher wird der ResourceBundle-Loader nicht rekursiv.

0

Sie könnten einen benutzerdefinierten PropertyResolver schreiben und dann die Logik ausführen, woher die Eigenschaftenwerte abgerufen werden sollen.

Zum Beispiel könnten Sie eine Bean namens messageSource definieren und laden Sie application.properties, plus Ihre CMS-Eigenschaften oder was auch immer Sie haben.

Dann schreiben Sie eine benutzerdefinierte (es gibt ein Beispiel dafür, wie diese Message die mit Frühling zu tun here) und verknüpfen Sie es sich in Ihrem faces-config.xml so etwas wie dies mit:

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

Vielen Dank für die Idee, aber ich würde weit bevorzugen, die vorhandene Ressource laden, die über f: loadBundle bereitgestellt wird, dann die Eigenschaftsauflösung zu ändern. Ich kann bereits eine programmatische Kontrolle durch Erweiterung des ResuceBundle wie in der Frage gewinnen. –

Verwandte Themen