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

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

enter image description here

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

javax.servlet.ServletException:/view/common/businessObjectTypeListView.xhtml @34,94 listener = "# {businessObjectTypeListController.selectData}": Целевая недоступность, идентификатор 'businessObjectTypeListController' разрешен к null

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

Ответ 1

В файле commons-web-1.0.jar необходимо иметь совместимый с JSF 2.0 файл /META-INF/faces-config.xml, чтобы заставить 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.

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

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

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

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

...

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

Ответ 2

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

У меня есть проект common.jar, где я разместил CDI beans. (без 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, где я могу поставить вас?

Ответ 3

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

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