Перезагрузка файла свойств, который загружается с помощью SetBundle
-
30-09-2019 - |
Вопрос
Я надеялся на небольшую помощь с проблемой, которую я имею в весной. Итак, настройка, которую я имею, такая:
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
), и попробуйте тогда.