在单独的jar中使用复合组件部署支持bean

时间:2012-09-13 21:43:44

标签: jsf jsf-2 web-deployment composite-component backing-beans

我在JBoss AS 6.1上部署我的Web应用程序时遇到了一些困难。我当前的Project分为主Web应用程序(控制器/托管bean和使用JSF 2 facelets的web前端)和一个带有复合组件+后备bean的jar。但是当我尝试访问该页面时,我收到一条错误,指出无法实例化指定的组件类型。

将辅助bean复制到主Web应用程序可以解决问题,但这不是我想要的。那么有什么需要注意的吗?

支持bean看起来像

@FacesComponent(value = "elementBase")
public class ElementBase extends UINamingContainer {
    ...
}

和复合组件接口

<composite:interface componentType="elementBase">
... some attributes
</composite:interface>

jar的结构如下

-- META-INF
    |-- resources
    |    |-- components
    |         |-- elementBase.xhtml
-- com
    |-- example
    |    |-- ElementBase.class

我还尝试使用组件类型在faces-config.xml文件夹中添加META-INF,但仍未找到组件类型。

1 个答案:

答案 0 :(得分:4)

通过BalusC对问题JEE6> Packaging JSF facelets (xhtml) and ManagedBeans as JAR

的回答
  

对于托管bean和其他JSF类(如验证器,转换器等),只需使用@ManagedBean@FacesValidator@FacesConverter等对它们进行注释,然后将它们打包到JAR中办法。您只需要在JAR中提供兼容JSF 2.0的/META-INF/faces-config.xml文件。

<?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中的类以获取JSF特定的注释。或者,您也可以在JAR的faces-config.xml中以JSF 1.x方式注册它们。

Java EE6 Tutorial: Application Configuration Resource File

  

您可以为应用程序提供多个应用程序配置资源文件。 JavaServer Faces实现通过查找以下内容来查找配置文件:

     
      
  • Web应用程序的/META-INF/faces-config.xml目录和父类加载器中的任何JAR文件中名为/WEB-INF/lib/的资源。如果存在具有此名称的资源,则将其作为配置资源加载。此方法适用于包含某些组件和渲染器的打包库。此外,任何名称以faces-config.xml结尾的文件也被视为配置资源,并按此加载。

  •   
  • Web部署描述符文件中的上下文初始化参数javax.faces.application.CONFIG_FILES,它指定Web应用程序的多个配置文件的一个或多个(逗号分隔)路径。此方法最常用于企业级应用程序,该应用程序委派独立组负责维护大型应用程序的每个部分的文件。

  •   
  • 应用程序的/WEB-INF/目录中名为faces-config.xml的资源。简单的Web应用程序以这种方式使其配置文件可用。

  •   

..我可以解决我的问题。

逐步解决方案

  1. 创建支持bean

    @FacesComponent(value = "elementBase")
    public class ElementBase extends UINamingContainer {
        ...
    }
    
  2. 以及具有以下界面的复合组件

    <composite:interface componentType="elementBase">
        ... some attributes, value holder, ..
    </composite:interface>
    
  3. 在已部署的jar中提供faces-config.xml,以指示jar包含带注释的类。部署的jar的结构应该看起来像

    -- META-INF
        |-- resources
        |    |-- components
        |         |-- elementBase.xhtml
        |-- faces-config.xml
    -- com
        |-- example
        |    |-- ElementBase.class
    
  4. 将jar部署在Web应用程序的/WEB-INF/lib文件夹中。

  5. 研究/相关链接和主题