Как ссылаться на управляемые bean-компоненты JSF, которые предоставляются в JAR-файле?

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

введите описание изображения здесь

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

javax.servlet.ServletException: /view/common/businessObjectTypeListView.xhtml @ 34,94 listener = “# {businessObjectTypeListController.selectData}”: objective недоступна, идентификатор ‘businessObjectTypeListController’ разрешен для null

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

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

        

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

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

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

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

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

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

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

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

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

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

    Я использую eclipse / juno en deploy для Glassfish 3.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, где я могу вас поместить?

    По-моему, class BusinessObjectTypeListController основан правильно, но не создается.

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

    Давайте будем гением компьютера.