Pregunta

Me esperaba un poco de ayuda con un problema que estoy teniendo que implica archivos de propiedades en la primavera. Por lo que la configuración que tengo es de esta manera:

opto-mapping.properties - esto se encuentra en mi carpeta src y contiene traducciones de mis recursos optimizados de esta manera:

generic-min.css=4037119659.css

Este archivo Properies se actualiza cada vez que se ejecute la acumulación ‘Optimizar’. Luego utilizo

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

Para importar mi archivo de propiedades en mi jsp deseada. A continuación, haciendo referencia al contenido mediante:

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

Todo esto funciona muy bien excepto que el archivo de propiedades requiere un reinicio Tomcat que ser recargada. Yo no quiero tener que empezar a tomar los sitios abajo cada vez que un recurso se actualiza. Me gustaría el archivo de propiedades para recargar automáticamente cada cierto tiempo.

Lo hice intento de actualizar un bean existente en mi primavera-context.xml para recargar este archivo de propiedades como lo hago con traducciones, pero esto no ha funcionado - más que probable debido a la ubicación de los archivos opto-mapping.properties - pero ver que tiene que ser en ese lugar para cargar utilizando 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>

Cualquier ayuda o un punto en la dirección correcta sería muy apreciada en este momento difícil.

Espero que todo esto hace que Senese y muchas gracias de antemano!

G.

¿Fue útil?

Solución

Hay algunas cosas que usted puede intentar.

<fmt:setBundle> finalmente llamará ResourceBundle.getBundle(String, Locale, ClassLoader) , donde la cuerda será su nombre base y el cargador de clases será Thread.currentThread().getContextClassLoader(). Si está utilizando JDK 1.6, puede probar a usar ResourceBundle.clearCache(ClassLoader) borrar la caché de paquete. No tendría sentido hacer esto en un filtro de servlet y combinarla con alguna otra lógica para determinar cuando la caché debe ser limpiado.

Otro ángulo es tomar el control más directo sobre la carga del archivo de propiedades y la configuración de JSTL. Una vez más, haciendo uso de un filtro (ignorando el manejo de excepciones):

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

A continuación, puede simplemente usar <fmt:message> en sus páginas. Puede encontrar la documentación para LocalizationContext y Config en el JSTL API .

son posibles Muchas otras variaciones, pero asegúrese de echar un vistazo a la nueva ResourceBundle (incluyendo ResourceBundle.Control) adiciones a JDK 1.6, tenga en cuenta la funcionalidad del API "de bajo nivel" como URLConnection, y familiarizarse con la aspectos más programáticos de JSTL disponibles a través de su API.

Otros consejos

Gracias a ambos por sus respuestas. ahora tengo este trabajo y pensaba que iba a compartir la riqueza.

Así, moví mi archivo de propiedades de la carpeta src y en WEB-INF / propiedades.

He actualizado la siguiente frijol para cargar los archivos de propiedades:

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

Ahora, con anterioridad que estaba usando setBundle cargar en mi archivo de propiedades como esta:

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

Pero descubrí que, obviamente, mi archivo de propiedades no era ser cargado más porque me había movido. Pero debido a mi configuración de frijol se carga el nuevo archivo de propiedades, pero mi setBundle se overwritting eso.

Por lo tanto, la solución era eliminar el setBundle y ahora mi archivo de propiedades está recargando!

Gracias de nuevo!

Tomcat no se volverá a cargar los recursos que se encuentran en la ruta de clase. Esto se afirma en el Javadoc para ReloadableResourceBundleMessageSource:

  

Dado que los servidores de aplicaciones suelen almacenar en caché todos los archivos cargados desde la ruta de clases, es necesario almacenar los recursos en otro lugar (por ejemplo, en el directorio "WEB-INF" de una aplicación web). De lo contrario, los cambios de archivos en la ruta de clase no se reflejará en la aplicación.

Tales ubicaciones classpath incluyen WEB-INF/classes, y no serán liberados.

Trate de mover opto-mapping.properties en otro lugar (por ejemplo WEB-INF/messages), y probarlo entonces.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top