JSF и автоматическая перезагрузка файлов xhtml

У меня были некоторые проблемы с горячей перезагрузкой файлов XHTML с использованием JRebel, Spring, JSF Mojarra 2.0.3 и WebLogic 10.3.

JRebel успешно перезагружает обычные классы Java и файлы js/css в /WebContent, но не файлы .xhtml JSF. Полная перепубликация была необходима для обновления файлов xhtml на сервере.

Путем проб и ошибок я, наконец, заставил его работать, добавив некоторые параметры лицевых панелей в web.xml и создав собственный ResourceResolver, как описано в этом сообщении блога.

Однако мне интересно, ПОЧЕМУ это работает, а точнее:

  • Зачем нужен пользовательский ResourceResolver?
  • Разве JRebel не должен обрабатывать это, отслеживая /WebContent, где находятся файлы xhtml?
  • Я предполагаю, что это как-то связано с компиляцией Facelets/JSF xhtml в сервлеты (?) Через FacesServlet, который JRebel не может обнаружить?

person Mads Mobæk    schedule 22.09.2011    source источник


Ответы (2)


JRebel обрабатывает изменения в папке /WebContent.

Проблема в том, что Facelets кэширует и не перечитывает измененные файлы. Для принудительного повторного чтения укажите следующие параметры в web.xml.

JSF 2 (Facelets 2.x):

<!-- Time in seconds that facelets should be checked for changes since last request. A value of -1 disables refresh checking. -->
<context-param>
    <param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
    <param-value>0</param-value>
</context-param>

<!-- Set the project stage to "Development", "UnitTest", "SystemTest", or "Production". -->
<!-- An optional parameter that makes troubleshooting errors much easier. -->
<!-- You should remove this context parameter before deploying to production! -->
<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>

Для JSF 1.2 (Facelets 1.x) параметры:

<context-param>
    <param-name>facelets.REFRESH_PERIOD</param-name>
    <param-value>0</param-value>
</context-param>
<context-param>
    <param-name>facelets.DEVELOPMENT</param-name>
    <param-value>true</param-value>
</context-param>

Подробнее о параметрах контекста JSF: http://docs.jboss.org/jbossas/6/JSF_Guide/en-US/html/jsf.reference.html#standard.config.params

Этот пользовательский преобразователь ресурсов не нужен в вашем случае. Этот распознаватель ресурсов - это просто хитрый способ получить файлы xhtml из папки пользовательской файловой системы. В вашем случае JRebel делает это (и даже больше).

person Andrey    schedule 22.09.2011
comment
Я считаю, что JRebel уже неявно делает это. По крайней мере, здесь это так. Обратите внимание, что ваши параметры контекста специфичны для Facelets 1.x, и что OP использует Facelets 2.x. - person BalusC; 22.09.2011
comment
@Balusc Спасибо за ответ, ответ обновлен, чтобы соответствовать Facelets 2.x. - person Andrey; 22.09.2011
comment
Установка javax.faces.FACELETS_REFRESH_PERIOD на 0 и javax.faces.PROJECT_STAGE на Development, по-видимому, не запускает обновленные шаблоны с JRebel в JSF 2.0.4 и WebLogic 10.3. - person uggedal; 27.09.2011
comment
@uggedal OP отметил, что «наконец-то он заработал, добавив некоторые параметры лицевых панелей в web.xml и создав собственный ResourceResolver». Я не знаю, работает ли он для него без специального преобразователя ресурсов. - person Andrey; 27.09.2011
comment
Должен любить переполнение стека. javax.faces.FACELETS_REFRESH_PERIOD отлично сработало для меня. JBoss 4, JSF2. - person Magnilex; 19.04.2013
comment
Наша команда использует Glassfish 3/IceFaces, и мы уже давно установили FACELETS_REFRESH_PERIOD на -1. Установка его на 0 включила горячую перезагрузку XHTML. - person dseibert; 12.07.2013
comment
это изменение необходимо для использования jsf с jrebel - person mokarakaya; 25.06.2015

Вот как я исправил это для себя:

  1. Убедитесь, что плагин facelets включен в настройках JRebel и
  2. Убедитесь, что вы используете Project Stage Development в своем web.xml
person Rajat Gupta    schedule 29.03.2014