JSF 2 localisation (managed bean)
J'ai un fichier de propriétés pour la localisation:
foo=Bar
title=Widget Application
Ceci est lié en tant que resource-bundle
dans les faces-config:
<resource-bundle>
<base-name>com.example.messages.messages</base-name>
<var>msgs</var>
</resource-bundle>
Je peux accéder à ce très bien dans les facelets vue à l'aide de EL:
<title>#{msgs.title}</title>
Cependant, si il ya des choses comme SQLExceptions, j'ai besoin d'être en mesure d'écrire des messages à partir du managed bean. C'est tout ce travail aussi:
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "There was an error saving this widget.", null);
FacesContext.getCurrentInstance().addMessage(null, message);
Voilà le problème: je veux avoir ces messages proviennent du fichier de propriétés, de sorte qu'ils, trop, peut être modifié sur la base des paramètres régionaux. Est-il un moyen facile d'accéder aux propriétés de fichier à l'aide de l'injection?
OriginalL'auteur Zack Marrapese | 2010-08-13
Vous devez vous connecter pour publier un commentaire.
J'ai demandé à un très liés à la question sur la SORTE:
Comment injecter un non-classe sérialisable (comme java.util.ResourceBundle) avec Soudure
Et à l'intérieur de la Couture du Forum:
http://seamframework.org/Community/HowToCreateAnInjectableResourcebundleWithWeld
Pour résumer:
J'ai réalisé une injection de ResourceBundle avec 3 Producteurs.
D'abord vous avez besoin d'un FacesContextProducer. J'ai pris celui de la Couture 3 Alpha sources.
Alors vous avez besoin d'un LocaleProducer, qui utilise le FacesContextProducer. J'ai aussi pris de Couture 3 Alpha.
Vous avez maintenant tous les éléments pour créer un ResourceBundleProducer, qui peut ressembler à ceci:
Vous pouvez maintenant @Inject le ResourceBundle dans vos haricots. Attention, il doit être injecté dans un transitoire de l'attribut, sinon vous obtiendrez une exception se plaindre que ResourceBundle n'est pas sérialisable.
OriginalL'auteur ifischer
Il est plus facile à utiliser, par exemple, le message module de MyFaces CODI!
OriginalL'auteur Peter
Vous pouvez le faire avec la JSF seul.
Commencez par définir une propriété gérée sur le backing bean. Dans le cadre du programme de configuration, vous pouvez définir la gestion de la propriété de la valeur d'une expression EL que les références de votre regroupement de ressources.
J'ai fait quelque chose comme ce qui suit à l'aide de Tomcat 6. Le seul inconvénient est que vous ne pouvez pas accéder à cette valeur à partir de votre sauvegarde de l'haricot constructeur, depuis JSF ne sera pas encore initialisé. Utilisation
@PostConstruct
sur une méthode d'initialisation si la valeur est nécessaire au début de la fève de son cycle de vie.Cela a l'avantage de rendre le backing bean méthodes moins dépendante de la présentation de la technologie, de sorte qu'il devrait être plus facile à tester. Il dissocie également votre code de détails comme le nom donné à l'ensemble.
Quelques tests à l'aide de Mojarra 2.0.4-b09 ne montrer qu'une petite incohérence lorsqu'un utilisateur modifie les paramètres régionaux de mi-session. En page EL expressions utiliser les nouveaux paramètres régionaux mais le backing bean n'est pas en raison de la nouvelle ResourceBundle de référence. Pour le rendre compatible, vous pouvez utiliser le haricot de la valeur de la propriété EL expressions, telles que l'utilisation de
#{backingBean.messages.greeting}
en place de#{msgs.greeting}
. Puis la page de EL et le backing bean serait toujours utiliser les paramètres régionaux qui était actif au début de la session. Si les utilisateurs avait pour changer les paramètres régionaux de mi-session et d'obtenir de nouveaux messages, vous pouvez essayer de faire une demande d'étendue de haricots et de donner des références à la fois à la session bean et regroupement de ressources.Dans JSF2 vous pouvez simplement utiliser
@ManagedProperty("#{msgs}") private ResourceBundle msgs;
(avec setter).OriginalL'auteur GargantuChet
Voici un exemple sur la façon de le faire:
http://www.laliluna.de/articles/javaserver-faces-message-resource-bundle-tutorial.html
Vous voulez avoir un coup d'oeil à la
ResourceBundle.getBundle()
partie.Salutations,
Lars
@MessageBundle
ou quelque chose, et puis il suffit de passer de nouveau unProperties
objet...J'ai utilisé cette approche dans un de nos derniers projets, nous avons eu le problème identique avec DB erreurs. Je peux avoir un coup d'oeil à la vieille source, le mercredi de la semaine prochaine, si ce n'est toujours pas résolue.
Vous avez raison que c'est une bonne façon de le faire. Je me demandais juste si il y avait un moyen de le faire de manière plus élégante. Je peux utiliser le CDI pour l'injecter. Qui fonctionne si il n'y a pas intégré dans l'annotation.
OriginalL'auteur Lars
C'est une vieille question, mais je vais ajouter une autre façon de le faire. Je cherchais quelque chose d'autre et couru à travers de ce. Les méthodes ici, tout semblait compliquée pour quelque chose qui ne me frappe pas comme tous les que difficile. Jouer avec des paillettes, parce que c'est assez, si vous me demandez.
Donné un fichier:
À l'intérieur du fichier:
J'ai créer un "getBundle()" méthode car j'aime rattraper le moteur d'exécution et d'ajouter un message signicatif si je comprends où il veut en venir. Pas difficile et peut vous aider si vous obtenez le coup de tête de jouer avec les fichiers de propriétés pour une raison quelconque, et ne pas tout mettre à jour correctement. Je fais parfois ce que c'est parfois une méthode d'aide au sein d'une classe (pour moi). Cela permet de maintenir le try catch encombrement de l'importance de code.
En utilisant le chemin d'accès complet vers le fichier vous permet de le mettre quelque part autre que l'emplacement par défaut/répertoire si vous avez d'autres idées sur l'organisation.
OriginalL'auteur Bill Rosmus