Domanda

speravo per un piccolo aiuto con un problema che sto avendo coinvolgono file di proprietà in primavera. Così la messa a punto che ho è in questo modo:

opto-mapping.properties - questo si trova nella mia cartella src e contiene le traduzioni per le mie risorse ottimizzati in questo modo:

generic-min.css=4037119659.css

Questo file properies viene aggiornato ogni volta che si esegue il build ‘ottimizzare’. allora io uso

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

Per importare i miei file delle proprietà nel mio jsp desiderato. Poi riferimento al contenuto utilizzando:

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

Questa tutte le opere in modo bello tranne che il file delle proprietà richiede un riavvio gatto essere ricaricati. Io non voglio avere a iniziare a prendere i siti giù ogni volta una risorsa viene aggiornata. Vorrei che il file delle proprietà per ricaricare automaticamente ogni tanto.

Ho fatto il tentativo di aggiornare un bean esistente nella mia primavera-context.xml per ricaricare questo file proprietà come faccio con le traduzioni, ma questo non ha funzionato - più che probabile a causa della posizione dei file opto-mapping.properties - ma si vedere ha bisogno di essere in quella posizione per caricare usando 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>

Qualsiasi aiuto o un punto nella giusta direzione sarebbe molto apprezzato in questo momento difficile.

Spero che tutto questo rende senese e grazie in anticipo!

G.

È stato utile?

Soluzione

Ci sono alcune cose che si potrebbe provare.

<fmt:setBundle> finirà per chiamare ResourceBundle.getBundle(String, Locale, ClassLoader) , in cui la stringa sarà la vostra base e l'classloader sarà Thread.currentThread().getContextClassLoader(). Se stai usando JDK 1.6, si può provare a utilizzare ResourceBundle.clearCache(ClassLoader) per cancellare la cache fascio. Avrebbe senso fare questo in un filtro servlet e combinarlo con qualche altra logica per determinare quando la cache deve essere cancellata.

Un altro angolo è prendere il controllo più diretto sul caricamento del file delle proprietà e la configurazione di JSTL. Ancora una volta, facendo uso di un filtro (ignorando gestione delle eccezioni):

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

Poi si può semplicemente utilizzare <fmt:message> nelle vostre pagine. È possibile trovare la documentazione per LocalizationContext e Config nel JSTL API .

Un sacco di altre variazioni sono possibili, ma assicuratevi di dare un'occhiata al ResourceBundle più recente (compreso ResourceBundle.Control) aggiunte al JDK 1.6, tenere a mente la funzionalità delle API "di livello inferiore" come URLConnection, e prendere confidenza con il aspetti più programmatiche JSTL disponibili attraverso l'API.

Altri suggerimenti

Vi ringrazio entrambi per le vostre risposte. Ora ho ottenuto questo lavoro e ho pensato condividere la ricchezza.

Quindi, ho spostato i miei file delle proprietà dalla cartella src e in WEB-INF / proprietà.

Ho aggiornato il seguente fagiolo per caricare i file di proprietà:

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

Ora, in precedenza usavo setBundle a carico nel mio file di proprietà in questo modo:

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

Ma ho scoperto che ovviamente la mia proprietà del file non era in corso di caricamento più perché mi ero spostato. Ma a causa del mio setup di fagioli il nuovo file delle proprietà è stata caricata, ma la mia era setBundle overwritting che.

Quindi, la soluzione era quella di rimuovere il setBundle e ora il mio file di proprietà sta caricando!

Grazie ancora!

Tomcat non verrà ricaricato le risorse che si trovano sul percorso di classe. Questo è indicato nel javadoc per ReloadableResourceBundleMessageSource:

  

Dal server applicativi in ??genere nella cache tutti i file caricati dal classpath, è necessario memorizzare le risorse da qualche altra parte (ad esempio, nella directory "WEB-INF" di una web app). In caso contrario, i cambiamenti dei file nel classpath non si rifletteranno nella richiesta.

Tali luoghi del percorso di classe includono WEB-INF/classes, e non saranno rilasciati.

Prova a spostare opto-mapping.properties altrove (ad esempio WEB-INF/messages), e provare poi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top