10
votes

Comment recharger le forfait de ressources dans l'application Web?

J'ai un ensemble de ressources en tant que classe Java qui a lu des valeurs à partir de la base de données. Lorsque je mettant à jour DB, j'ai besoin de recharger le paquet, mais je ne sais pas comment. N'importe qui aide?

<f:loadBundle basename="model.helpers.Messages" var="m" />


0 commentaires

3 Réponses :


4
votes
Messages_en .clearCache();

2 commentaires

Je remarque que lorsque j'ai un paquet de message défini dans Face-config.xml au lieu d'utiliser F: LoadBundle - Le rechargement ne fonctionne pas. Quelqu'un sait pourquoi?


Cela peut avoir travaillé une fois une fois, mais ce n'est pas sur mes installations Wildfly 8-> 10, même en passant des chargeuses de classe, etc., il est mis en cache et est rechargé avec les données d'origine de cette masse.



11
votes

Ce n'est pas exactement trivial.

Pour une juste effacement du ResourceBundle via ClearCache () ne donne pas toujours les résultats souhaités. Souvent, vous avez besoin au moins d'essayer d'essayer d'utiliser le chargeur de classe de contexte:

de la ressourcebundle.clearCache (fil-currentthread (). GetContextClassloader ()); Cela ne rechargera toujours pas le faisceau de ressources défini dans un fichier faces-config.xml. Au moins la mise en œuvre de Mojarra JSF 1.2 met en cache en privé la bundle de ressources en interne. Cela se produit dans: xxx

Il est possible d'effacer ce cache via une réflexion (à la fin de la journée, il s'agit simplement d'une entrée sur une carte), ou vous voudrez peut-être remplacer le Application. Les deux ne sont pas des choses que vous ne faites pas normalement légèrement.

purement pour le développement que vous pourriez utiliser JREBEL, qui a probablement déjà une connaissance de Mojarra et le truc de réflexion mentionné probablement ci-dessus.

après Expérimentation, je suis arrivé au code suivant qui fait l'affaire sur Jboss comme 5 / JSF 1.2. Il lie votre code à Mojarra (importateurs Sun Packages) 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: xxx

(remplacez la méthode d'assistant GetFieldValue avec votre propre utilfeuille de réflexion favorable si nécessaire et saupoudrer avec des manutenants d'exception et nul le cas échéant)


3 commentaires

Bonjour Arjan, content de connaître ce teck, j'ai joué autour de moi, je n'ai pas travaillé pour moi pour que Glassfish n'est que je n'ai essayé d'utiliser un ensemble de ressources et un niveau d'application de niveau d'affichage, tous deux ont échoué à l'aide de cet ajustement dans GF env.


Quelle version de Glassfish était-ce? Si c'est v3, je suppose que cela ne fonctionne peut-être pas car la version de Mojarra est totalement différente. Je travaille sur un projet JBoss en tant que projet, donc je l'ai testé là-bas, mais cela pourrait également ne pas fonctionner sur JBoss comme 6.


sa v3, toute idée de savoir comment faire du travail en V3 et le système informera si vous commencez votre commentaire avec @AserSername



1
votes

Vous pouvez même éviter d'importer des classes SOUDIER et JSF-PLEM dans votre module avec quelques autres lignes de réflexion:

Class<?> applicationAssociateClass = Class.forName("com.sun.faces.application.ApplicationAssociate");
Method getCurrentInstance = applicationAssociateClass.getMethod("getCurrentInstance");
Object applicationAssociate = getCurrentInstance.invoke(null);
Method getResourceBundles = applicationAssociate.getClass().getMethod("getResourceBundles");
Map<String, ?> resourceBundles = (Map<String, ?>)getResourceBundles.invoke(applicationAssociate);
Object appBundle = resourceBundles.get(name);
Map<Locale, ResourceBundle> resources = getFieldValue(appBundle, "resources");
resources.clear();


1 commentaires

Cela a bien fonctionné pour moi dans Wildfly 8, seule chose qui a effacé cette cache stupide ...