JSF 2-Lokalisierung (verwaltete Bean)

7

Ich habe eine Eigenschaftendatei für die Lokalisierung:

%Vor%

Dies ist als resource-bundle in faces-config gebunden:

%Vor%

Ich kann in der Facelets-Ansicht mit EL gut darauf zugreifen:

%Vor%

Wenn es jedoch Dinge wie SQLExceptions gibt, muss ich in der Lage sein, Nachrichten von der verwalteten Bean zu schreiben. Das funktioniert alles auch:

%Vor%

Hier ist das Problem: Ich möchte, dass diese Nachrichten aus der Eigenschaftendatei kommen, so dass sie auch basierend auf dem Gebietsschema geändert werden können. Gibt es eine einfache Möglichkeit, auf die Eigenschaftendatei zuzugreifen, indem Sie die Injektion verwenden?

    
Zack Marrapese 13.08.2010, 14:56
quelle

5 Antworten

16

Ich habe eine ganz ähnliche Frage zu SO gestellt: Wie injiziere ich einen serialisierbare Klasse (wie java.util.ResourceBundle) mit Weld

Und im Seam Forum: Ссылка

Zusammenfassend: Ich habe ein injizierbares ResourceBundle mit 3 Produzenten realisiert. Zuerst benötigen Sie einen FacesContextProducer. Ich nahm den aus den 3 Alpha-Quellen von Seam.

%Vor%

Dann benötigen Sie einen LocaleProducer, der den FacesContextProducer verwendet. Ich habe es auch von Seam 3 Alpha genommen.

%Vor%

Jetzt haben Sie alles, um einen ResourceBundleProducer zu erstellen, der so aussehen kann:

%Vor%

Jetzt können Sie @ das ResourceBundle in Ihre Beans eingeben. Achten Sie darauf, dass es in ein transientes Attribut eingefügt werden muss. Andernfalls erhalten Sie eine Ausnahme, die angibt, dass ResourceBundle nicht serialisierbar ist.

%Vor%     
ifischer 09.09.2010, 11:27
quelle
2

Es ist einfacher, z.B. das Nachrichtenmodul von MyFaces CODI !

    
Peter 28.11.2010 21:12
quelle
2

Sie können dies mit JSF alleine machen.

Beginnen Sie mit der Definition einer verwalteten Eigenschaft in Ihrer Backing-Bean. In der JSF-Konfiguration können Sie den Wert der verwalteten Eigenschaft auf einen EL-Ausdruck festlegen, der auf Ihr Ressourcenpaket verweist.

Ich habe etwas wie das Folgende mit Tomcat 6 gemacht. Die einzige Einschränkung ist, dass Sie nicht auf diesen Wert vom Konstruktor Ihrer Backing-Bean zugreifen können, da JSF ihn noch nicht initialisiert hat. Verwenden Sie @PostConstruct für eine Initialisierungsmethode, wenn der Wert früh im Lebenszyklus der Bean benötigt wird.

%Vor%

Dies hat den Vorteil, dass Ihre Backing-Bean-Methoden weniger von der Präsentationstechnologie abhängig sind. Daher sollte es einfacher sein, sie zu testen. Es entkoppelt auch Ihren Code von Details wie dem Namen, der dem Bündel gegeben wurde.

Einige Tests mit Mojarra 2.0.4-b09 zeigen eine kleine Inkonsistenz, wenn ein Benutzer das Gebietsschema während der Sitzung ändert. In-Page-EL-Ausdrücke verwenden das neue Gebietsschema, aber das Backing-Bean erhält nicht den neuen ResourceBundle-Verweis. Um es konsistent zu machen, könnten Sie den Wert der Bean-Eigenschaft in EL-Ausdrücken verwenden, z. B. #{backingBean.messages.greeting} anstelle von #{msgs.greeting} verwenden. Dann würden die Seite EL und die Backing-Bean immer das Gebietsschema verwenden, das zu Beginn der Sitzung aktiv war. Wenn Benutzer während der Sitzung zwischen den Sitzungen wechseln und die neuen Nachrichten abrufen sollen, können Sie versuchen, eine beanspruchungsabhängige Bean zu erstellen und ihr Referenzen sowohl auf die Session-Bean als auch auf das Ressourcenbündel zu geben.

    
GargantuChet 10.11.2011 23:19
quelle
0

Hier ist ein Beispiel, wie man das macht: Ссылка

Sie möchten sich den ResourceBundle.getBundle() -Teil ansehen.

Grüße, Lars

    
Lars 13.08.2010 15:07
quelle
0

Das ist eine alte Frage, aber ich füge einen anderen Weg hinzu, dies zu tun. Ich habe nach etwas anderem gesucht und bin darüber gestolpert. Die Methoden hier schienen alle für etwas verworren, das mir nicht so schwer fällt. Mit Glitzer spielen, weil es hübsch ist, wenn du mich fragst.

Gegeben eine Datei:

%Vor%

Innerhalb der Datei:

%Vor%

Ich erstelle eine "getBundle ()" Methode, da ich gerne die Laufzeit abfangen und eine sinnvolle Nachricht hinzufügen möchte, damit ich verstehe, woher sie kommt. Nicht schwer und kann helfen, wenn Sie die Laune haben, aus irgendwelchen Gründen mit den Eigenschaftendateien zu spielen und nicht alles richtig zu aktualisieren. Manchmal mache ich das privat, weil es manchmal eine Hilfsmethode innerhalb einer Klasse ist (für mich). Dies hält den Versuch, den bedeutungsvollen Code aus dem Weg zu räumen.

Wenn Sie den vollständigen Pfad zur Datei verwenden, können Sie ihn an einer anderen Stelle als dem Standardverzeichnis / -verzeichnis ablegen, wenn Sie andere Ideen zur Organisation haben.

%Vor%     
BillR 05.09.2012 08:06
quelle

Tags und Links