我有一个具有以下结构的 WAR 文件:
JSF 托管 beanBusinessObjectTypeListController
位于commons-web-1.0.jar
in /WEB-INF/lib
并在中引用BusinessObjectTypeListView.xhtml
。当我运行 Web 应用程序并调用该视图时,出现以下错误:
javax.servlet.ServletException:/view/common/businessObjectTypeListView.xhtml @34,94listener =“#{businessObjectTypeListController.selectData}”:目标无法访问,标识符“businessObjectTypeListController”解析为null
为什么找不到控制器类?它应该在类路径中,是吗?
您需要符合 JSF 2.0 标准/META-INF/faces-config.xml
文件在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
文件将被扫描。
您还应该确保您这样做not有metadata-complete="true"
属性中的<faces-config>
webapp自己的声明/WEB-INF/faces-config.xml
文件,否则 JSF 将假定此面孔配置已完成,因此不会自动扫描 JAR 文件以获取注释。
如果这些条件都不满足(或不能满足),那么您需要手动将 bean 注册为<managed-bean>
在 webapp 自己的/WEB-INF/faces-config.xml
而不是依赖注释。
另见第 11.4.2 章JSF 2.0 规范 http://jcp.org/aboutJava/communityprocess/final/jsr314/index.html(强调我的)。
11.4.2 应用程序启动行为
...
该算法为组装基于 JSF 的 Web 组件的开发人员提供了相当大的灵活性
应用。例如,一个应用程序可能包含一个或多个自定义 UIComponent 实现,以及
关联的渲染器,因此可以在名为“/WEB-INF/faces-config.xml”的应用程序资源中声明它们
无需以编程方式将它们注册到应用程序实例。此外,应用程序可能会选择
包含一个包含“META-INF/faces-config.xml”资源的组件库(打包为 JAR 文件)。该资源的存在导致组件、渲染器和其他 JSF 实现类存储在该资源中
库 JAR 文件将自动注册,应用程序无需执行任何操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)