11

我有一个具有以下结构的 WAR 文件:

在此处输入图像描述

JSF 托管 beanBusinessObjectTypeListController位于 中commons-web-1.0.jar并在 中/WEB-INF/lib引用BusinessObjectTypeListView.xhtml。当我运行我的 Web 应用程序并调用该视图时,我收到以下错误:

javax.servlet.ServletException:/view/common/businessObjectTypeListView.xhtml @34,94 listener="#{businessObjectTypeListController.selectData}":目标无法到达,标识符“businessObjectTypeListController”解析为空

为什么找不到控制器类?它应该在类路径中,是吗?

4

3 回答 3

29

您需要在文件/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 文件的每个类,这太昂贵了。/META-INF/faces-config.xml仅扫描具有上述文件的 JAR 。

您还应该确保在webapp 自己的文件的声明中没有metadata-complete="true"属性,否则 JSF 将假定此 faces 配置是完整的,因此不会自动扫描 JAR 文件中的注释。<faces-config>/WEB-INF/faces-config.xml

如果这些条件都不满足(或不能满足),那么您需要手动将 bean 注册为<managed-bean>webapp 自己的/WEB-INF/faces-config.xml,而不是依赖注释。

另请参阅JSF 2.0 规范的第 11.4.2 章(强调我的)。

11.4.2 应用程序启动行为

...

该算法为组装基于 JSF 的 Web 应用程序组件的开发人员提供了相当大的灵活性。例如,应用程序可能包含一个或多个自定义 UIComponent 实现以及相关的渲染器,因此它可以在名为“/WEB-INF/faces-config.xml”的应用程序资源中声明它们,而无需以编程方式将它们注册到应用程序实例。此外,应用程序可能会选择包含一个包含“META-INF/faces-config.xml”资源的组件库(打包为 JAR 文件)。 此资源的存在导致存储在此库 JAR 文件中的组件、渲染器和其他 JSF 实现类被自动注册,应用程序不需要任何操作。

于 2011-10-05T15:37:43.510 回答
1

在我的情况下,我对 CDI bean 有同样的问题。

我有 common.jar 项目,我在其中放置了 CDI bean。(没有 beans.xml),我有 webapp.war,其中包含 common.jar 的 lib 和 beans.xml。

当我从 jsf 调用 cdi bean 时,我得到它不可访问异常:/

项目结构是使用 maven 创建的: - common.jar 的 maven-archetype-quickstart - webapp.war 的 maven-archetype-webapp

我正在使用 eclipse/juno 部署到 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,我把你放在哪里?

于 2013-02-15T09:24:21.820 回答
0

在我看来,BusinessObjectTypeListController 类是正确创建的,但没有实例化。

如何在视图上创建类的实例?如果您使用 BeanFactory,请查看配置 xml 文件

于 2011-10-05T15:57:43.577 回答