如何引用JAR文件中提供的JSF托管bean?

Fra*_*sco 11 java jar java-ee jsf-2 managed-bean

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

在此输入图像描述

在JSF托管bean BusinessObjectTypeListController位于commons-web-1.0.jar/WEB-INF/lib和参考的BusinessObjectTypeListView.xhtml.当我运行我的Web应用程序并调用该视图时,出现以下错误:

javax.servlet.ServletException:/view/common/businessObjectTypeListView.xhtml @ 34,94 listener ="#{businessObjectTypeListController.selectData}":目标无法访问,标识符'businessObjectTypeListController'已解析为null

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

Bal*_*usC 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>
Run Code Online (Sandbox Code Playgroud)

JSF确实没有扫描类路径中每个JAR文件的每个类,这本来太贵了.仅/META-INF/faces-config.xml扫描具有上述文件的JAR .

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

如果没有这些条件是(或可以)满足,那么你需要手动注册bean作为<managed-bean>在Web应用程序本身/WEB-INF/faces-config.xml,而不是依靠注解.

另见JSF 2.0规范的第11.4.2章(强调我的).

11.4.2应用程序启动行为

...

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