Перезагрузка файла свойств, который загружается с помощью SetBundle

StackOverflow https://stackoverflow.com/questions/4136403

Вопрос

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

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

generic-min.css=4037119659.css

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

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

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

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

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

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

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

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

ГРАММ.

Это было полезно?

Решение

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

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

Другие советы

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

Итак, я перенес свой файл свойств из папки SRC в Web-Inf/свойства.

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top