Перезагрузка файла свойств, который загружается с помощью setBundle - PullRequest
6 голосов
/ 09 ноября 2010

Я надеялся на небольшую помощь в решении проблемы с файлами свойств в Spring. Таким образом, у меня есть такая установка:

opto-mapping.properties - он находится в моей папке src и содержит переводы для моих оптимизированных ресурсов, например:

generic-min.css=4037119659.css

Этот файл свойств обновляется каждый раз, когда запускается сборка "optimize". Я тогда использую

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

Чтобы импортировать мой файл свойств в нужный мне jsp. Затем ссылки на содержимое с помощью:

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

Все это прекрасно работает, за исключением того, что файл свойств требует перезагрузки tomcat для перезагрузки. Я не хочу начинать удалять сайты каждый раз, когда ресурс обновляется. Я хотел бы, чтобы файл свойств периодически перезагружался.

Я попытался обновить существующий bean-компонент в моем spring-context.xml, чтобы перезагрузить этот файл свойств, как я это делаю с переводами, но это не сработало - скорее всего, из-за расположения файлов opto-mapping.properties - но вы увидеть, что это должно быть в этом месте для загрузки с помощью 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>

Любая помощь или точка в правильном направлении будет принята с благодарностью в это трудное время.

Я надеюсь, что все это делает разум, и большое спасибо заранее!

G.

Ответы [ 3 ]

5 голосов
/ 11 ноября 2010

Спасибо вам обоим за ваши ответы. Теперь я получил эту работу и думал, что поделюсь богатством.

Итак, я переместил свой файл свойств из папки src в WEB-INF / properties.

Я обновил следующий bean-компонент, чтобы загрузить файлы свойств:

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

Теперь ранее я использовал setBundle для загрузки в свой файл свойств следующим образом:

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

Но я обнаружил, что, очевидно, мой файл свойств больше не загружался, потому что я его переместил. Но из-за моей установки bean-компонента новый файл свойств загружался, но мой setBundle перезаписывал это.

Итак, решение было удалить setBundle, и теперь мой файл свойств перезагружается!

Еще раз спасибо!

4 голосов
/ 09 ноября 2010

Tomcat не будет перезагружать ресурсы, находящиеся в пути к классам.Это указано в javadoc для ReloadableResourceBundleMessageSource:

Поскольку серверы приложений обычно кэшируют все файлы, загруженные из пути к классам, необходимо хранить ресурсы где-то еще (например,в каталоге веб-приложения «WEB-INF»).В противном случае изменения файлов в пути к классам не будут отражены в приложении.

Такие местоположения пути к классам включают WEB-INF/classes и не будут освобождены.

Попробуйте переместить opto-mapping.properties в другое место(например, WEB-INF/messages), а затем попробуйте.

1 голос
/ 09 ноября 2010

Есть несколько вещей, которые вы можете попробовать.

<fmt:setBundle> в конечном итоге вызовет ResourceBundle.getBundle(String, Locale, ClassLoader), где строка будет вашим базовым именем, а загрузчик классов будет Thread.currentThread().getContextClassLoader().Если вы используете JDK 1.6, вы можете попробовать ResourceBundle.clearCache(ClassLoader), чтобы очистить кеш пакета.Было бы целесообразно сделать это в фильтре сервлетов и объединить его с некоторой другой логикой, чтобы определить, когда кэш должен быть очищен.

Другой аспект - более непосредственный контроль над загрузкой файла свойств и конфигурацией.JSTL.Опять же, используя фильтр (игнорируя обработку исключений):

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

Тогда вы можете просто использовать <fmt:message> на своих страницах.Вы можете найти документы для LocalizationContext и Config в JSTL API .

Возможно множество других вариантов, но обязательно взгляните на более новую ResourceBundle(включая ResourceBundle.Control) дополнения к JDK 1.6, помните о функциональности «низкоуровневых» API, таких как URLConnection, и познакомьтесь с более программными аспектами JSTL, доступными через его API.

...