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

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

在此处输入图像描述

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

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

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

您需要在commons-web-1.0.jar文件中具有符合JSF 2.0的/META-INF/faces-config.xml文件,以便让JSF扫描JAR文件以获取具有JSF注释的类,如@ManagedBean和auto-注册他们。

    

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

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

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

另见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实现类自动注册,而不需要应用程序执行任何操作。

我的CDI bean也有同样的问题。

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

当我从jsf调用一个cdi bean时,我得到它是不可达的exception:/

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

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

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

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