4

我使用 JSF 2.2、Primefaces、Tomcat 7 依赖项创建了一个 Maven Web 应用程序。

我的 JSF 的实现是 Mojarra 2.2.4,我在我的 POM 上添加了这个依赖:

    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-api</artifactId>
        <version>2.2.4</version>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-impl</artifactId>
        <version>2.2.4</version>
        <scope>compile</scope>
    </dependency>

但不幸的是,我tomcat7-maven-plugin对它的嵌入式 tomcat 有疑问。如果我使用tomcat7:run命令,我的 webapp 启动没有问题,但是当它尝试加载托管 bean 时,我收到此错误:

目标不可达,标识符“testBean”解析为空

这表明 webapp 正在使用JSF 1.x而不是JSF 2.x. 的配置JSF 1.x器无法识别@ManagedBean注释,这将导致它们不会自动加载/初始化而无需 faces-config.xml。

我正在使用 tomcat Embedded 7.0.50,使用它进行配置:http: //tomcat.apache.org/maven-plugin-trunk/tomcat7-maven-plugin/adjust-embedded-tomcat-version.html

但是尽管我不认识@ManagedBean注释,但它只能在faces-config.xml.

有没有办法包括JSF 2.x对 Tomcat Embedded 的支持maven7-tomcat-plugin

PS:tomcat7:run-war有效,但我不喜欢,因为显然它是静态运行,没有任何可能动态更改 xhtml 代码(例如)。

4

1 回答 1

3

我按照以下步骤解决了从 Mojarra 2.2.4 切换到 MyFaces 2.2.0 的问题:

  1. 在我的 POM 中删除 Mojarra 依赖项
  2. 在我的 POM 中添加 MyFaces 依赖项:

    <dependency>
        <groupId>org.apache.myfaces.core</groupId>
        <artifactId>myfaces-api</artifactId>
        <version>2.2.0</version>
        <scope>compile</scope>
    </dependency>
    
    <dependency>
        <groupId>org.apache.myfaces.core</groupId>
        <artifactId>myfaces-impl</artifactId>
        <version>2.2.0</version>
        <scope>compile</scope>
    </dependency>
    
  3. 更改我的 web.xml 上的侦听器类

    <listener>
    <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
    

  4. 在我的 web.xml 上添加上下文参数

    <context-param>
         <description>Defines which packages to scan for beans, separated by commas.
             Useful for when using maven and jetty:run (version 6) or tomcat:run
        </description>
        <param-name>org.apache.myfaces.annotation.SCAN_PACKAGES</param-name>
        <param-value>eu.dedalus</param-value>
    

.5 从 WEB-INF/lib 中删除 jsf-api 和 jsf-impl。

.6[ECLIPSE ONLY]使用 M2REPO 变量在 Build Path 中添加 myfaces.api 和 myfaces-impl 库,并删除 jsf-api 和 jsf-impl 库。

感谢https://stackoverflow.com/users/814956/lu4242

于 2014-02-11T09:56:25.050 回答