web-dev-qa-db-fra.com

Comment puis-je obtenir une chaîne de bundle de messages à l'intérieur d'un bean géré?

Je voudrais pouvoir récupérer une chaîne d'un paquet de messages à l'intérieur d'un bean géré JSF 2. Cela serait fait dans les situations où la chaîne est utilisée comme paramètre de résumé ou de détails dans un FacesMessage ou comme message dans une exception levée.

Je veux m'assurer que le bean géré charge le groupe de messages correct pour les paramètres régionaux de l'utilisateur. Pour moi, la façon de procéder à partir d'un bean géré à l'aide d'appels API JSF n'est pas claire.

Ma configuration est:

  • Utilisation de Tomcat 7 comme conteneur pour que la solution ne puisse pas dépendre d'appels d'API qui ne fonctionnent que dans un conteneur de serveur d'applications complet
  • Utilisation de l'implémentation de référence JSF 2 (Mojarra)
  • NE PAS utiliser de bibliothèques qui autorisent CDI

NOTE: J'ai vu cette question similaire , mais cela dépend de fonctionnalités qui ne sont pas disponibles dans ma configuration

EDIT: J'ai fait une erreur dans ma question d'origine. Ce que je voulais demander était "Comment puis-je obtenir une chaîne de bundle ressource à l'intérieur d'un bean géré"? BalusC m'a donné la bonne réponse à ce que j'ai demandé. La solution pour ce que je voulais réellement demander est très similaire:

public static String getResourceBundleString(
            String resourceBundleName,
            String resourceBundleKey)
        throws MissingResourceException {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ResourceBundle bundle = 
        facesContext.getApplication().getResourceBundle(
            facesContext, resourceBundleName);
    return bundle.getString(resourceBundleKey);
}

En outre, voici un lien vers ne autre question qui explique la différence entre les bundles "message" et les bundles "ressource".

30
Jim Tough

Vous pouvez obtenir le nom complet complet de l'ensemble de <message-bundle> Par Application#getMessageBundle() . Vous pouvez obtenir les paramètres régionaux actuels par UIViewRoot#getLocale() . Vous pouvez obtenir un ResourceBundle d'un nom de bundle complet et des paramètres régionaux par ResourceBundle#getBundle() .

Donc, résumé:

FacesContext facesContext = FacesContext.getCurrentInstance();
String messageBundleName = facesContext.getApplication().getMessageBundle();
Locale locale = facesContext.getViewRoot().getLocale();
ResourceBundle bundle = ResourceBundle.getBundle(messageBundleName, locale);
// ...

Mise à jour : selon l'erreur dans la question, vous voulez réellement obtenir le bundle identifié par le <base-name> De <resource-bundle>. Ce n'est malheureusement pas directement disponible par une API JSF standard. Vous devez soit coder en dur le même nom de base dans le code et substituer le messageBundleName dans l'exemple ci-dessus, soit l'injecter en tant que propriété gérée sur <var> Dans un bean à portée de requête:

@ManagedProperty("#{msg}")
private ResourceBundle bundle; // +setter
50
BalusC
FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle bundle = context.getApplication().getResourceBundle(context, "msg");
String message = bundle.getString("key");

voici la clé est le nom de la propriété à laquelle vous souhaitez accéder à partir du fichier de propriétés.

       message = This is "message"

Cette entrée provient du fichier messages.properites. et "message" est "clé".

24
keiler

Il existe deux façons d'obtenir un ensemble de ressources String dans un bean géré, en utilisant baseName ou varName (voir la définition de chacun ci-dessous):

Utilisation de varName:

varName: est la chaîne représentant le <var></var> dans <resource-bundle>

FacesContext context = FacesContext.getCurrentInstance();
Application app = context.getApplication();
ResourceBundle bundle = app.getResourceBundle(context, varName);
String msg = bundle.getString("key");

Utilisation de baseName:

baseName: nom complet du groupe de ressources (<base-name> dans <resource-bundle>).

FacesContext context = FacesContext.getCurrentInstance();
Locale locale = context .getViewRoot().getLocale();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
ResourceBundle bundle = ResourceBundle.getBundle(baseName, locale, loader);
String msg = bundle.getString("key");
5
Tarik