Wie einige Ressourcen aus einem Property außer Kraft zu setzen
-
19-08-2019 - |
Frage
Ich habe eine exsisting Java / JSF Website der gesamte Text auf dem Bildschirm von Eigenschaftsdateien kommt über
Für eine Laufzeit konfigurierbare Teilmenge davon Ich bin zu wollen, um die Zeichenfolge ziehen aus sonst wo (CMS über Web-Service). Mit Blick auf der Resource Klasse appares es eine infrastructer für eine eng, etwas zu diesem mit einer Delegation zu einem übergeordneten Resource.
Ich bin somethis wie diese wollen
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
}
}
Ich habe versucht, diese und Eltern sind null, ich nehme an, dies für den Fall des Ausfalls mehr verwendet -> en. -> de_DE
Ich betrachte das nicht sehr ansprechend Möglichkeit hat die Eigenschaft, Datei einen anderen Namen aus dem benutzerdefinierten Resource und dann durch den gesamten Stapel von ResourceBundle.getBundle Delegieren (PROPERTY_FILE_NAME) .getString (key) aus CustomResourceBundle.handleGetObject (key) .
Jede bessere Ideen?
Lösung
ich am Ende zu lösen dies, indem geprüft wird, ob wir einen Alternativwert hatten, 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);
}
}
Beachten Sie den kleinen Unterschied in Namensklasse ist UILabels das ist, was alle Clients die Datei zu verwenden ist UILabelsFile so die Resourceloader nicht rekursiv geht.
Andere Tipps
Sie können eine benutzerdefinierte PropertyResolver schreiben, und dann haben, dass die Logik durchführen, wo aus die Eigenschaftswerte zu ziehen.
Zum Beispiel könnten Sie eine Bohne genannt messageSource
definieren und dass die Last bis application.properties, plus Ihre CMS Eigenschaften oder was auch immer Sie haben.
Dann schreiben Sie eine benutzerdefinierte PropertyResolver
(es gibt ein Beispiel dafür, wie diese Message die mit Frühling zu tun hier ) und es in etwas zu Ihrem faces-config.xml
Link:
<application>
<property-resolver>
com.package.MessageSourcePropertyResolver
</property-resolver>
</application>