Ceci n'est pas exactement trivial.
Pour un effacement juste le ResourceBundle
via clearCache()
ne donne pas toujours les résultats souhaités. Souvent, vous avez besoin au moins aussi effacer en utilisant le chargeur de classe de contexte:
ResourceBundle.clearCache(Thread.currentThread().getContextClassLoader());
Cependant, cela rechargera pas encore le regroupement de ressources définies dans un fichier faces-config.xml. Au moins l'implémentation Mojarra JSF 1.2 met en cache le bundle de ressources en interne. Cela se produit dans:
FacesContext -> Application -> associate (ApplicationAssociate) -> resourceBundles (Map<String, ApplicationResourceBundle>()) -> resources (Map<Locale, ResourceBundle>)
Il est possible d'effacer cette mémoire cache par réflexion (à la fin de la journée, il est juste une entrée dans une carte), ou vous voudrez peut-être remplacer l'application. Les deux ne sont pas des choses que vous faites normalement avec légèreté. Juste pour le développement, vous pouvez utiliser JRebel, qui a probablement déjà la connaissance de Mojarra et probablement le truc de réflexion mentionné ci-dessus. Après quelques expériences, je suis arrivé au code suivant qui fait l'affaire sur JBoss AS 5/JSF 1.2. Il lie votre code à Mojarra (importe des paquets solaires) et peut rompre avec n'importe quelle mise à niveau en raison des astuces réfléchissantes utilisées. Mais de toute façon, c'est le code:
public static void reloadBundle() {
ResourceBundle.clearCache(Thread.currentThread().getContextClassLoader());
ApplicationResourceBundle appBundle = ApplicationAssociate.getCurrentInstance().getResourceBundles().get("your_bundle_name");
Map<Locale, ResourceBundle> resources = getFieldValue(appBundle, "resources");
resources.clear();
}
@SuppressWarnings("unchecked")
private static <T> T getFieldValue(Object object, String fieldName) {
try {
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
return (T) field.get(object);
} catch (Exception e) {
return null;
}
}
(remplacer la méthode d'aide getFieldValue avec votre propre favori réfléchissant util si nécessaire et saupoudrer de gestionnaires d'exception et null le cas échéant)
Comment cela aide-t-il exactement? –
Fonctionne bien. Merci :) – marioosh
Je remarque que lorsque j'ai un paquet de messages défini dans faces-config.xml au lieu d'utiliser f: loadBundle - le rechargement ne fonctionne pas. Quelqu'un sait pourquoi? – marioosh