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:
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".
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
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é".
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):
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");
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");