Как ссылаться на управляемые bean-компоненты JSF, которые представлены в файле JAR? - PullRequest
11 голосов
/ 05 октября 2011

У меня есть файл WAR со следующей структурой:

enter image description here

Управляемый компонент JSF BusinessObjectTypeListController расположен в commons-web-1.0.jar в /WEB-INF/lib и указан в BusinessObjectTypeListView.xhtml. Когда я запускаю свое веб-приложение и вызываю это представление, я получаю следующую ошибку:

javax.

Почему класс контроллера не найден? Это должно быть в classpath, не так ли?

Ответы [ 3 ]

29 голосов
/ 05 октября 2011

Вам необходимо иметь файл /META-INF/faces-config.xml, совместимый с JSF 2.0, в файле commons-web-1.0.jar, чтобы заставить JSF сканировать файл JAR на наличие классов с аннотациями JSF, таких как @ManagedBean, и автоматически регистрировать их.

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
</faces-config>

JSF не сканирует каждый класс каждого JAR-файла в пути к классам, что было бы слишком дорого. Будут сканироваться только файлы JAR с указанным выше файлом /META-INF/faces-config.xml.

Вы также должны убедиться, что у не есть атрибут metadata-complete="true" в объявлении <faces-config> собственного файла /WEB-INF/faces-config.xml веб-приложения, в противном случае JSF будет считать, что эта конфигурация Faces завершена и поэтому выиграет не сканировать JAR-файлы для аннотаций.

Если ни одно из этих условий не выполнено (или не может быть выполнено), вам нужно вручную зарегистрировать компонент как <managed-bean> в собственном веб-приложении /WEB-INF/faces-config.xml вместо того, чтобы полагаться на аннотации.

См. Также главу 11.4.2 Спецификация JSF 2.0 (выделено мной).

11.4.2 Поведение при запуске приложения

...

Этот алгоритм обеспечивает значительную гибкость для разработчиков, которые собирают компоненты сети на основе JSF. приложение. Например, приложение может включать одну или несколько пользовательских реализаций UIComponent вместе с связанные рендереры, поэтому он может объявить их в ресурсе приложения с именем «/WEB-INF/faces-config.xml» без необходимости программно регистрировать их в экземпляре приложения. Кроме того, приложение может выбрать включить библиотеку компонентов (упакованную как файл JAR), которая включает в себя ресурс «META-INF /face-config.xml». Наличие этого ресурса вызывает компоненты, средства визуализации и другие классы реализации JSF, которые хранятся в этом JAR-файл библиотеки, подлежащий автоматической регистрации, без каких-либо действий, требующихся приложению.

1 голос
/ 15 февраля 2013

У меня та же проблема с компонентами CDI в моем случае.

У меня есть проект common.jar, в который я поместил компоненты CDI.(без beans.xml), и у меня есть webapp.war, который содержит common.jar в его lib и beans.xml.

, когда я вызываю компонент cdi из jsf, я получаю, что это недостижимое исключение:/

структура проекта создается с использованием maven: - maven-archetype-quickstart для common.jar - maven-archetype-webapp для webapp.war

Я использую eclipse / juno en deploy в Glassfish3.1.x.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Решено: Для упаковки EJB и JAR вы должныпоместите файл beans.xml в файл src / main / resources / META-INF /.Для WAR-упаковки вы должны поместить beans.xml в src / main / webapp / WEB-INF /.Помните, что только файлы .java должны быть помещены в каталоги src / main / java и src / test / java.Ресурсы, подобные файлам .xml, должны находиться в каталоге src / main / resources.

из темы: CDI: beans.xml, куда я могу вас поместить?

0 голосов
/ 05 октября 2011

По моему мнению, класс BusinessObjectTypeListController основан правильно, но не создан.

Как создать экземпляр класса в представлении?Если вы используете BeanFactory, просмотрите конфигурационные xml-файлы

...