Frage

Ich habe gehofft, für eine wenig Hilfe mit einem Problem, das ich Eigenschaften von Dateien im Frühjahr beteiligt habe. Also das Setup ich habe, ist wie folgt:

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

generic-min.css=4037119659.css

Diese properies Datei jedes Mal, ‚Optimieren‘ die Build aktualisiert wird ausgeführt wird. Ich habe dann verwenden

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

Um meine Eigenschaften Datei in meinem gewünschten jsp zu importieren. Dann verweist den Inhalt unter Verwendung:

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

Mit dieser Ausnahme alles funktioniert wunderbar, dass die Eigenschaftendatei einen tomcat Neustart erfordert neu geladen werden. Ich möchte nicht jedes Mal nach unten nehmen Websites zu beginnen haben eine Ressource aktualisiert wird. Ich würde die Eigenschaften Datei gerne automatisch jede neu laden so oft.

Ich habe versucht, eine bestehende Bohne in meiner Feder-context.xml zu aktualisieren, um diese Eigenschaften Datei erneut zu laden, wie ich mit Übersetzungen zu tun, aber das hat nicht funktioniert - mehr als wahrscheinlich wegen der opto-mapping.properties Dateien Lage - aber Sie sehen sie in dieser Position sein muss geladen werden mit 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>

Jede Hilfe oder ein Punkt in der richtigen Richtung stark in dieser schwierigen Zeit geschätzt würde.

Ich hoffe, dass all diese senese und vielen Dank im Voraus macht!

G.

War es hilfreich?

Lösung

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

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

Ein weiterer Winkel nimmt mehr direkte Kontrolle über das Laden der Eigenschaften-Datei 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 können die Dokumentation für LocalizationContext und Config in der JSTL API .

Viele andere Variationen sind möglich, aber stellen Sie sicher, dass Sie einen Blick auf die neuere ResourceBundle nehmen (einschließlich ResourceBundle.Control) Ergänzungen zu JDK 1.6, beachten Sie die Funktionalität von „lower-level“ APIs wie URLConnection, und sich mit der mehr programmatische Aspekte der JSTL finden Sie durch ihre API.

Andere Tipps

Danke euch beiden für eure Antworten. Ich habe jetzt diese Arbeit und dachte, ich würde den Reichtum teilen.

Also, ich zog meine Eigenschaften der src-Ordner-Datei und in WEB-INF / Eigenschaften.

ich die 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, vorher war ich setBundle zu Last in meine Eigenschaften Datei wie folgt aus:

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

Aber ich fand, dass offensichtlich meine Eigenschaften Datei wasnt Wesen geladen mehr, weil ich es bewegt hatte. Aber wegen meines Bean-Setup der neuen Eigenschaften-Datei geladen wurde, aber meine setBundle wurde overwritting das.

So, das war die Lösung der setBundle zu entfernen, und jetzt meine Eigenschaften Datei nachlädt!

Danke nochmal!

Tomcat nicht Ressourcen neu zu laden, die auf dem Classpath sind. Dies wird in der 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). Ansonsten ändert sich von Dateien im Classpath nicht in der Anwendung berücksichtigt werden.

Eine solche Classpath Standorte sind WEB-INF/classes, und wird nicht freigegeben werden.

Versuchen opto-mapping.properties bewegen anderswo (z WEB-INF/messages), und versuchen Sie es dann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top