我使用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'已解析为空
这表示网络应用正在使用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
上使用managedbean标记。
有没有办法为JSF 2.x
添加maven7-tomcat-plugin
对Tomcat Embedded的支持?
PS:tomcat7:run-war
有效,但我不喜欢,因为很明显它是静态运行,没有任何可能在飞行中更改xhtml代码(例如)。
答案 0 :(得分:3)
我决定按照以下步骤从Mojarra 2.2.4切换到MyFaces 2.2.0:
在我的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>
在我的web.xml上更改listener-class
<listener>
<listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
在我的web.xml上添加context-param
<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库。