2010-11-09 7 views
6

Ich hoffte auf ein wenig Hilfe mit einem Problem, das ich mit Eigenschaftendateien im Frühjahr habe. Also das Setup ich habe, ist wie so:Neuladen der Eigenschaftendatei, die mit setBundle geladen wird

opto-mapping.properties - in meinem src-Ordner befindet und enthält Übersetzungen für meine optimierte Ressourcen wie so:

generic-min.css=4037119659.css 

Diese properies Datei aktualisiert wird Jedes Mal, wenn der Build 'optimieren' ausgeführt wird. Ich verwende dann

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

Um meine Eigenschaftendatei in meine gewünschte JSP zu importieren. Dann verweist den Inhalt unter Verwendung:

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

Das alles funktioniert sehr schön, außer dass die Properties-Datei erfordert ein tomcat nachgeladen werden neu starten. Ich möchte nicht jedes Mal, wenn eine Ressource aktualisiert wird, Websites herunterfahren müssen. Ich möchte, dass die Eigenschaftendatei automatisch so oft neu geladen wird.

Ich habe versucht, eine vorhandene Bean in meiner spring-context.xml zu aktualisieren, um diese Eigenschaftsdatei wie bei Übersetzungen neu zu laden, aber das hat nicht funktioniert - mehr als wahrscheinlich wegen der opto-mapping.properties Dateien - aber Sie müssen sehen, dass es an diesem Ort sein muss, um mit fmt: setBundle zu laden.

<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> 

Jede Hilfe oder ein Punkt in die richtige Richtung würde in dieser schwierigen Zeit sehr geschätzt werden.

Ich hoffe all das macht Senese und vielen Dank im Voraus!

G.

Antwort

1

Es gibt ein paar Dinge, die Sie versuchen könnten.

<fmt:setBundle> wird schließlich ResourceBundle.getBundle(String, Locale, ClassLoader) aufrufen, wobei die Zeichenfolge Ihr Basisname und der Klassenlader Thread.currentThread().getContextClassLoader() sein wird. Wenn Sie JDK 1.6 verwenden, können Sie versuchen, den Bündelcache mit ResourceBundle.clearCache(ClassLoader) zu löschen. Es wäre sinnvoll, dies in einem Servlet-Filter zu tun und ihn mit einer anderen Logik zu kombinieren, um zu bestimmen, wann der Cache gelöscht werden soll.

Ein anderer Winkel ist direktere Kontrolle über das Laden der Eigenschaftendatei und die Konfiguration von JSTL.Wiederum unter Verwendung eines Filters (ohne Berücksichtigung von Ausnahmebehandlung):

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); 

Dann können Sie einfach <fmt:message> in Ihren Seiten. Sie finden die Dokumentation für LocalizationContext und Config in der JSTL API.

Viele andere Variationen sind möglich, aber stellen Sie sicher, einen Blick auf die neueren ResourceBundle (einschließlich ResourceBundle.Control) Ergänzungen nehmen 1,6 bis JDK, halten mit der Funktionalität von „untergeordneten“ APIs wie URLConnection und vertraut im Auge die programmatischeren Aspekte von JSTL, die über seine API verfügbar sind.

4

Tomcat nicht Ressourcen neu zu laden, die auf dem Classpath sind. Dies wird in dem angegebenen javadoc für ReloadableResourceBundleMessageSource:

Da Anwendungsserver in der Regel alle Dateien in dem Cache aus dem Classpath geladen wird, ist es notwendig, zu speichern Ressourcen woanders (zum Beispiel in dem „WEB-INF“ Verzeichnis eines Web App). Andernfalls werden Änderungen an Dateien im Klassenpfad nicht in der Anwendung wiedergegeben.

Solche Klassenpfadpositionen enthalten WEB-INF/classes und werden nicht freigegeben.

Versuchen Sie, opto-mapping.properties woanders zu verschieben (z. B. WEB-INF/messages), und versuchen Sie es dann.

+0

Super, vielen Dank für Ihr Feedback. Ich hoffe nur, dass dies kein Problem mit der Art und Weise verursachen wird, wie ich meine Properties-Datei lade (mit ). –

+0

Ich werde es morgen versuchen und hier meine Ergebnisse veröffentlichen. Vielen Dank! –

5

Vielen Dank für Ihre Antworten. Ich habe jetzt funktioniert und dachte, ich würde den Reichtum teilen.

Also habe ich meine Eigenschaftendatei aus dem Ordner Src und in WEB-INF/Eigenschaften verschoben.

ich folgende Bean aktualisiert, um die Eigenschaften von Dateien zu laden:

<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> 

Nun zuvor ich setBundle wurde mit in meine Eigenschaften laden Datei wie folgt aus:

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

Aber ich fand, dass Offensichtlich wurde meine Eigenschaftendatei nicht mehr geladen, weil ich sie verschoben hatte. Aber wegen meiner Bean-Konfiguration wurde die neue Eigenschaftendatei geladen, aber mein setBundle überschrieb das.

Also, die Lösung war das SetBundle zu entfernen und jetzt meine Eigenschaften-Datei wird neu geladen!

Danke nochmal!

Verwandte Themen