Когда я описывал свое предубеждение против JSF еще в ноябре, я писал:
… есть много людей, восхваляющих JSF 2 (и PrimeFaces более того ). Вот почему я буду интегрировать его (или объединить ваш запрос на включение) в выпуск 2.3 AppFuse. Поскольку PrimeFaces содержит тему Bootstrap, я надеюсь, что это приятный опыт, и мое общее мнение о JSF улучшается.
Вскоре после выпуска AppFuse 2.2.1 в декабре, Gilberto Андраде способствовал пример проекта , который использовал Mojarra ( для JSF RI) и PrimeFaces вместо MyFaces и его Томагавк компонентов. На прошлой неделе я потратил несколько часов на интеграцию изменений Гилберто в главную ветку AppFuse. Вы можете увидеть все изменения, которые я сделал (включая обновление плагина Jetty и некоторую очистку) в этом обзоре Crucible . Не стесняйтесь оставлять комментарии на задаваемые вопросы в самом обзоре.
Первое, что я заметил при интеграции PrimeFaces, это то, что вам нужно добавить собственный репозиторий, чтобы получать его артефакты через Maven.
<repositories> <repository> <id>prime-repo</id> <name>Prime Repo</name> <url>http://repository.primefaces.org</url> </repository> </repositories>
Это прискорбно, так как все другие зависимости AppFuse можно найти в Maven Central. Это означает, что если вы используете архетип JSF, репозиторий PrimeFaces сначала будет проверен на наличие артефактов, что приведет к ненужному замедлению разрешения артефактов. Я надеюсь, что разработчики PrimeFaces исправят это в ближайшее время.
Интегрируя эти две структуры, я столкнулся с рядом проблем.
- IllegalStateException при запуске при использовании «mvn jetty: run»
- Условное отображение кнопки отключает ее возможность нажатия
- Тема PrimeFaces Bootstrap 404s на некоторых изображениях
- Canoo WebTest не работает ни с fileUpload, ни для установки значений флажков
- Ресурсы PrimeFaces, обслуживаемые по адресу /javax.faces.resource/*, не найдены
IllegalStateException при запуске при использовании «mvn jetty: run»
Первая проблема, с которой я столкнулся, заключалась в том, что я не смог запустить приложение в Jetty. В Tomcat все работало нормально, но в Jetty я получил следующую ошибку:
2013-01-31 22:28:07.683:WARN:/:unavailable java.lang.IllegalStateException: Application was not properly initialized at startup, could not find Factory: javax.faces.context.FacesContextFactory at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:951) at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:316) at javax.faces.webapp.FacesServlet.init(FacesServlet.java:302) at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:492) at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:312)
Я нашел исправление для этого в Stack Overflow и добавил следующий слушатель в мой web.xml, чтобы решить эту проблему.
<listener> <listener-class>com.sun.faces.config.ConfigureListener</listener-class> </listener>
Условное отображение кнопки отключает ее способность щелкать
Следующее, что я заметил, было то, что кнопка «Удалить» не работала при редактировании пользователя. Он был правильно скрыт при добавлении пользователя, но нажатие на него для удаления пользователя просто обновляет страницу. Ниже приведен код, который я успешно использовал с MyFaces. По какой-то причине это не работает с PrimeFaces.
<c:if test="${not empty userForm.user.id}"> <h:commandButton value="#{text['button.delete']}" action="#{userForm.delete}" styleClass="btn" onclick="return confirmMessage(msgDelConfirm)"/> </c:if>
Я также попробовал следующее, но без игры в кости. В настоящее время это открытый вопрос .
<h:commandButton rendered="${not empty userForm.user.id}" value="#{text['button.delete']}" action="#{userForm.delete}" styleClass="btn" onclick="return confirmMessage(msgDelConfirm)"/>
Тема PrimeFaces Bootstrap 404s на некоторых изображениях
После интеграции темы PrimeFaces Bootstrap в журналах сервера появляется следующая ошибка.
[INFO] [talledLocalContainer] Feb 02, 2013 10:40:25 PM com.sun.faces.application.resource.ResourceHandlerImpl logMissingResource [WARNING] [talledLocalContainer] WARNING: JSF1064: Unable to find or serve resource, images/ui-bg_highlight-hard_70_000000_1x100.png, from library, primefaces-bootstrap.
Похоже, это уже случалось в предыдущих выпусках и в настоящее время является открытой проблемой .
Canoo WebTest не работает ни с fileUpload, ни для установки значений флажков.
Мы используем Canoo WebTest для запуска интеграционных тестов в пользовательском интерфейсе в AppFuse. По какой-то причине загрузка файлов и установка значений флажков работают нормально с MyFaces / Tomahawk, но не с Mojarra / PrimeFaces. Я не уверен, вызвано ли это ядром JSF или библиотекой компонентов, но это остается открытой проблемой . На данный момент я только что прокомментировал части тестов, которые раньше делали это.
В связи с этим, получение реального пути ресурса из ServletContext работало нормально до переключения, но теперь приводит к нулевому значению.
String uploadDir = getServletContext().getRealPath("/resources") + "/"+ request.getRemoteUser() + "/";
Ресурсы PrimeFaces, обслуживаемые по адресу /javax.faces.resource/*, не найдены
Хотя у меня не было проблем с этим в AppFuse, я столкнулся с этим в AppFuse Light. Я не знаю, почему между ними было различие, но оно, как оказалось, было вызвано UrlRewriteFilter и моим стремлением к URL без расширений . Исходящее правило для удаления .xhtml из URL было виновником. Добавление условия решило проблему. Да, состояние кажется задом наперед, но оно работает.
<outbound-rule match-type="regex"> <condition type="query-string" operator="equal">ln=primefaces</condition> <from>^(.*)\.xhtml(\?.*)?prebuffer_3lt;/from> <to last="false">$1$2</to> </outbound-rule>
Резюме
Первоначальный переход на Mojarra / PrimeFaces был довольно легок благодаря образцу проекта Гилберто. Однако небольшие проблемы, возникшие после этого, оказались довольно неприятными, и вы можете видеть, что некоторые из них все еще не устранены. Я думаю, это просто показывает, что не все веб-фреймворки идеальны. Надеюсь, мы исправим эти незначительные проблемы до следующего выпуска. А пока вы можете ознакомиться с обновленными демонстрационными версиями для AppFuse JSF и AppFuse Light JSF .