JSF2.0 ResourceBundle необходимо перезагрузить без перезапуска сервера - PullRequest
1 голос
/ 30 марта 2011

Мы используем JSF2.0 с JDK1.6 и Tomcat6.1

У нас есть требование обновлять значения файла свойств (загруженные комплектом ресурсов JSF) без перезапуска сервера, чтобы сеансы веб-сеанса работалине будет остановлен.

Возможно ли это с JDK1.6, я пробовал приведенный ниже код clearCache, но он не работал.

ResourceBundle bundle = ResourceBundle.getBundle("Label");
String s = bundle.getString("profile.firstName");
out.println("Value before: %"+ s);
ResourceBundle.clearCache(Thread.currentThread().getContextClassLoader());
bundle = ResourceBundle.getBundle("Label");
s = bundle.getString("profile.firstName");
out.println("Value after: {}"+s);

Кто-нибудь пробовал это раньше.

Обновление

Кажется, что нижеприведенное не решает проблему перезагрузки пакета ресурсов

ResourceBundle.clearCache(Thread.currentThread().getContextClassLoader());
ApplicationResourceBundle applicationBundle = ApplicationAssociate.getCurrentInstance().getResourceBundles().get("Label");
Field field = applicationBundle.getClass().getDeclaredField("resources");
field.setAccessible(true);
Map<Locale, ResourceBundle> resources = (Map<Locale, ResourceBundle>) field.get(applicationBundle);
resources.clear();

Я что-то пропустил?

1 Ответ

3 голосов
/ 30 марта 2011

Используется для работы с некоторыми реализациями / версиями JSF. Однако в более поздних версиях Mojarra механизм кэширования получил дополнительный уровень в самой реализации. Предполагая, что вы действительно используете Мохарру, в дополнение к строке

ResourceBundle.clearCache(Thread.currentThread().getContextClassLoader());

Вы также должны сделать это, начиная с com.sun.faces.application.ApplicationAssociate

ApplicationResourceBundle applicationBundle = ApplicationAssociate.getCurrentInstance().getResourceBundles().get("Label");
Field field = applicationBundle.getClass().getDeclaredField("resources");
field.setAccessible(true);
Map<Locale, ResourceBundle> resources = (Map<Locale, ResourceBundle>) field.get(applicationBundle);
resources.clear();

Да, это хак, но пока JSF не предоставляет чистых методов API для достижения того же.

...