Esto no es exactamente trivial.
Por un solo borrar el ResourceBundle
a través de clearCache()
no siempre se obtienen los resultados deseados. A menudo se necesitan al menos también tratar de limpiar usando el cargador de clases de contexto:
ResourceBundle.clearCache(Thread.currentThread().getContextClassLoader());
Sin embargo, esto todavía no se vuelva a cargar el paquete de recursos definidos en un archivo faces-config.xml. Al menos, la implementación de Mojarra JSF 1.2 almacena de forma privada el paquete de recursos internamente. Esto sucede en:
FacesContext -> Application -> associate (ApplicationAssociate) -> resourceBundles (Map<String, ApplicationResourceBundle>()) -> resources (Map<Locale, ResourceBundle>)
Es posible borrar esta caché a través de la reflexión (al final del día, es sólo una entrada en un mapa), o Es posible que desee sustituir la aplicación. Ambas cosas no son cosas que normalmente haces alegremente.
Puramente para el desarrollo podrías usar JRebel, que probablemente ya tenga conocimiento de Mojarra y probablemente haga el truco de reflexión mencionado anteriormente.
Después de experimentar, llegué al siguiente código que hace el truco en JBoss AS 5/JSF 1.2. Ata tu código a Mojarra (importa paquetes de sol) y puede romperse con cualquier mejora debido a los trucos reflexivos que se utilizan. Pero de todos modos, este es el código:
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;
}
}
(reemplazar el método de ayuda GetFieldValue con su propio favorito reflexivo util si es necesario y espolvorear con excepción y nulos los manipuladores en su caso)
¿Cómo ayuda esto exactamente? –
Funciona bien. Gracias :) – marioosh
Observo que cuando tengo el paquete de mensajes definido en faces-config.xml en lugar de usar f: loadBundle, la recarga no funciona. ¿Alguien sabe por qué? – marioosh