4 Stimmen

Wie man einige Ressourcen aus einem PropertyResourceBundle außer Kraft setzt

Ich habe eine bestehende Java/JSF-Website alle den Text auf dem Bildschirm kommt aus Eigenschaft Dateien über <f:loadBundle basename="org.example.applicaltion" var="applicaltion" /> die den Text aus applicaltion.properties zieht.

Für eine zur Laufzeit konfigurierbare Teilmenge davon möchte ich die Zeichenfolge von einem anderen Ort beziehen (CMS über Webdienste). Blick auf die ResourceBundle-Klasse scheint es eine Infrastruktur für etwas in der Nähe von diesem mit Delegation an eine übergeordnete ResourceBundle haben.

Ich wünsche mir etwas in dieser Art

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 dies versucht und Elternteil ist Null, ich nehme an, dies ist mehr für den Fall der Standard -> en -> en_GB verwendet.

Ich erwäge die nicht sehr ansprechende Option der haben die Eigenschaft Datei einen anderen Namen aus der benutzerdefinierten resourceBundle und dann delegieren durch den vollen Stapel von ResourceBundle.getBundle(PROPERTY_FILE_NAME).getString(key) von innerhalb CustomResourceBundle.handleGetObject(key).

Haben Sie eine bessere Idee?

2voto

David Waters Punkte 11759

Ich habe das Problem schließlich gelöst, indem ich überprüft habe, ob wir einen Überschreibungswert haben, und wenn ja, diesen zurückgegeben habe, und ansonsten an das Standard-Ressourcenbündel delegiert habe

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 im Namen Klasse ist UILabels, die ist, was alle Clients verwenden die Datei ist UILabelsFile, so dass die ResourceBundle-Loader nicht gehen rekursiv.

0voto

Sie könnten eine benutzerdefinierte PropertyResolver schreiben, und dann haben, dass die Logik, wo die Eigenschaft Werte aus zu ziehen durchführen.

Sie könnten zum Beispiel eine Bean namens messageSource und laden Sie damit die application.properties sowie Ihre CMS-Eigenschaften oder was auch immer Sie haben.

Dann schreiben Sie eine benutzerdefinierte PropertyResolver (es gibt ein Beispiel dafür, wie man das mit der MessageSource von Spring macht aquí ) und verknüpfen Sie es mit Ihrem faces-config.xml und zwar in etwa so:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X