Question

J'espérais un peu d'aide avec un problème que j'ai impliquant des fichiers de propriétés au printemps. Donc, la configuration que j'ai est comme ceci:

opto-mapping.properties - il se trouve dans mon dossier src et contient des traductions pour mes ressources optimisées comme ceci:

generic-min.css=4037119659.css

Ce fichier properies est mis à jour chaque fois que « optimiser » la construction est exécutée. J'utilise ensuite

<fmt:setBundle basename="opto-mapping" />

Pour importer mon fichier de propriétés dans mon choix jsp. faisant référence ensuite le contenu en utilisant:

<fmt:message key='generic-min.css' />

tous les travaux, à l'exception magnifiquement que le fichier de propriétés nécessite un redémarrage tomcat être rechargées. Je ne veux pas avoir à commencer à prendre des sites vers le bas à chaque fois une ressource est mis à jour. Je voudrais que le fichier de propriétés pour recharger automatiquement chaque si souvent.

Je l'ai fait pour tenter de mettre à jour un bean existant dans mon ressort context.xml de recharger ce fichier de propriétés comme je le fais avec des traductions, mais cela n'a pas fonctionné - plus que probable en raison de l'emplacement des fichiers opto-mapping.properties - mais vous voir il doit être à cet endroit pour charger en utilisant fmt:. setBundle

<bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="cacheSeconds">
            <value>1</value>
        </property>
        <property name="basenames">
            <list>
                <value>WEB-INF/translations/translations</value>
                <value>WEB-INF/classes/opto-mapping</value>
            </list>
        </property>
</bean>

Toute aide ou un point dans la bonne direction serait grandement apprécié dans cette période difficile.

J'espère que tout cela fait Senese et un grand merci à l'avance!

G.

Était-ce utile?

La solution

Il y a quelques choses que vous pourriez essayer.

<fmt:setBundle> finira par appeler ResourceBundle.getBundle(String, Locale, ClassLoader) , où la chaîne sera votre nom de base et le classloader sera Thread.currentThread().getContextClassLoader(). Si vous utilisez JDK 1.6, vous pouvez essayer d'utiliser ResourceBundle.clearCache(ClassLoader) pour effacer le cache paquet. Il serait logique de le faire dans un filtre de servlet et le combiner avec une autre logique pour déterminer quand le cache doit être effacé.

Un autre angle est de prendre le contrôle plus direct sur le chargement du fichier de propriétés et la configuration de JSTL. Encore une fois, en utilisant un filtre (en ignorant le traitement des exceptions):

ClassLoader ctxLoader = Thread.currentThread().getContextClassLoader();
URL propsURL = ctxLoader.getResource("opto-mapping.properties");
URLConnection propsConn = propsURL.openConnection();
long propsLastModified = propsConn.getLastModified();
// decide if you want to reload...
propsConn.setUseCaches(false);
InputStream propsIn = propsConn.getInputStream();
ResourceBundle propsBundle = new PropertyResourceBundle(propsIn);
propsIn.close();
LocalizationContext propsCtx = new LocalizationContext(propsBundle);
ServletContext servletCtx = this.filterConfig.getServletContext();
Config.set(servletCtx, Config.FMT_LOCALIZATION_CONTEXT, propsCtx);

Ensuite, vous pouvez simplement utiliser <fmt:message> dans vos pages. Vous pouvez trouver la documentation pour LocalizationContext et Config dans le JSTL API .

Beaucoup d'autres variantes sont possibles, mais assurez-vous de jeter un oeil à la nouvelle ResourceBundle (y compris ResourceBundle.Control) ajouts à JDK 1.6, garder à l'esprit la fonctionnalité d'API « bas niveau », comme URLConnection, et se familiariser avec le aspects programmatiques de JSTL disponibles à travers son API.

Autres conseils

Merci à vous deux pour vos réponses. J'ai maintenant obtenu ce travail et pensé que je pourrais partager la richesse.

Alors, je me suis déplacé mes fichier de propriétés sur le dossier src et dans WEB-INF / propriétés.

Je mis à jour le grain suivante pour charger les fichiers de propriétés:

<bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="cacheSeconds">
            <value>1</value>
        </property>
        <property name="basenames">
            <list>
                <value>WEB-INF/translations/translations</value>
                <value>WEB-INF/properties/opto-mapping</value>
            </list>
        </property>
    </bean>

Maintenant, auparavant j'utilisais setBundle à charger dans mon fichier de propriétés comme ceci:

<fmt:setBundle basename="opto-mapping" />

Mais je trouve que de toute évidence mon fichier propriétés était pas être plus chargé parce que je l'avais déplacé. Mais à cause de ma configuration de haricot le nouveau fichier de propriétés est en cours de chargement, mais mon setBundle était que écrasant.

Alors, la solution est d'enlever le setBundle et maintenant mon fichier de propriétés est rechargeait!

Merci encore!

Tomcat ne rechargera pas les ressources qui sont sur le chemin de classe. Ceci est indiqué dans le javadoc ReloadableResourceBundleMessageSource:

  

Étant donné que les serveurs d'application cache généralement tous les fichiers chargés à partir du chemin de classe, il faut stocker des ressources à un autre endroit (par exemple, dans le répertoire « WEB-INF » d'une application Web). Sinon, les modifications des fichiers dans le classpath ne seront pas répercutées dans l'application.

Ces emplacements classpath comprennent WEB-INF/classes, et ne seront pas libérés.

Essayez de déplacer opto-mapping.properties ailleurs (par exemple WEB-INF/messages), et essayer alors.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top