Charger dynamiquement des fichiers sur le chemin de classe à l'aide de ReloadableResourceBundleMessageSource
Je suis nouveau sur le Printemps et je suis d'essayer de l'utiliser de ReloadableResourceBundleMessageSource classe.
Je suis d'essayer de l'utiliser de sorte que nous n'avons plus à redémarrer notre application web pour les fichiers de propriétés de changements/mises à jour.
J'ai une application web (en utilisant Principalement JSF) et un autre, de goudron composant qui contient tous mes fichiers de propriétés.
La structure des propriétés de goudron est comme suit:
- CompanyOneMessages.properties
- CompanyOneMessages_fr_FR.properties
- CompanyTwoMessages.properties
- CompanyTwoMessages_fr_FR.properties
- CompanyThreeMessages.properties
- CompanyThreeMessages_fr_FR.properties
- ...
Ce goudron est décompressé et déployé à un emplacement sur le serveur qui est spécifié comme été sur le chemin de la classe dans websphere configurations.
J'ai ajouté ce qui suit à mon applicationContext-config.xml:
<!-- Enable reloading of resource bundles without requiring web-app restart -->
<bean id="messages"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:com/resource/dynamic/CompanyOneMessages</value>
<value>classpath:com/resource/dynamic/CompanyTwoMessages</value>
<value>classpath:com/resource/dynamic/CompanyThreeMessages</value>
</list>
</property>
<property name="cacheSeconds" value="1" />
</bean>
<!-- Declare location of bean to handle messages and define property reference
we will use to reference message properties throughout the presentation layer -->
<bean id="myappMessages" class="com.myapp.resource.MyAPPMessages">
<property name="messages" ref="messages" />
</bean>
Tout cela fonctionne très bien.
MAIS, il n'est pas entièrement résoudre le problème d'origine.
Toutes les fois que je veux ajouter une nouvelle société pour notre application, je vais devoir ajouter une nouvelle ligne à la applicationContext-config.xml fichier et de les redéployer/redémarrage de l'application web.
Je voudrais être en mesure de simplement placer la nouvelle société des propriétés de fichier dans les propriétés de goudron et pour qu'il soit dynamiquement ramassé.
Est-il possible de prolonger la ReloadableResourceBundleMessageSource classe de telle manière qu'il va chercher le chemin de classe pour les propriétés des fichiers sur l'application de démarrage et de charge dynamique de tous?
Mise à jour
C'est ce que j'ai à ce jour:
applicationContext-config.xml:
<bean id="messages" class="com.resource.MyAPPReloadableResourceBundleMessageSource">
</bean>
MyAPPReloadableResourceBundleMessagesource:
package com.myapp.resource;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
public class MyAPPReloadableResourceBundleMessageSource extends ReloadableResourceBundleMessageSource
{
public MyAPPReloadableResourceBundleMessageSource()
{
getResourceBundlesMessages();
//Simply single basename test
setBasename("classpath:/resource/dynamic/companyOneMessages");
}
@Override
public void setBasename(String baesname)
{
System.out.println("In setBasename");
super.setBasename(baesname);
}
@Override
public void setBasenames(String[] baesnames)
{
System.out.println("In setBasenames");
super.setBasenames(baesnames);
}
private String[] getResourceBundlesMessages()
{
String[] propertiesFiles = null;
//How do I get all filenames with .properties under com.resources.dynamic? (location is under classpath)
return propertiesFiles;
}
}
Donc tout ce que je besoin est de savoir comment obtenir une liste de tous les fichiers dans le classpath .extension de propriétés?
Grâce
Thomas
OriginalL'auteur Thomas Buckley | 2012-01-27
Vous devez vous connecter pour publier un commentaire.
ReloadableResourceBundleMessageSource
requiert les fichiers sous la webapp/répertoire, pas dans votre classpath (il ne peut pas recharger ces).OriginalL'auteur JamesC
Vous êtes sur le droit chemin de l'extension de la
ReloadableResourceBundleMessageSource
. @JamesC mentionné, et par Ressort de la documentation de l'API pourReloadableResourceBundleMessageSource
:J'ai eu une demande similaire comme vous. Le clé à la résolution d'un prolongement de
ReloadableResourceBundleMessageSource
et en remplaçant lacalculateAllFilenames(String basename, Locale locale)
méthode pour faire plus que d'ajouter des codes de langue pour le nom de base.Par exemple, si j'ai tous mes messages externes des fichiers de propriétés sous
/srv/myapp/messages
(dans le système de fichiers, PAS de chemin de classe), la méthode de remplacement serait de faire quelque chose comme:Dans mon cas, ma liste de
basenames
sont statiques et donc, je n'ai pas l'emporter sur d'autres méthodes que les appelscalculateAllFilenames()
pour chaque nom de base.Dans votre cas particulier, je voudrais utiliser
Company
que le nom de base et remplacercalculateAllFilenames()
à scanner un répertoire en dehors de votre classpath pour résoudre réelle basenames et ensuite appelersuper.calculateAllFilenames()
pour chaque résolu basename (c'est à diresuper.calculateAllFilenames("file:///path/to/CompanyOneMessages", locale)
). Potentiellement, quelque chose de semblable à https://stackoverflow.com/a/11223178/1034436 pourrait l'aider. Remarque: contrairement à l'référencé réponse, je ne ferais pas le répertoire de numérisation dans le cadre d'un accesseur de propriété si l'résolu liste de noms de base peut changer dynamiquement. Bien sûr, des considérations de performance pour votre application devra également être pesé comme il serait de toute évidence une augmentation substantielle des fichiers.OriginalL'auteur martian111