我尝试熟悉页面流等新的 jsf 2.2 功能。所以我在 Tomcat 7 和 Spring 的帮助下完成了我的项目。
一切正常,直到我添加第一个流配置并尝试访问该流。 我很确定我缺少依赖性,但是什么样的。
我在通话中得到了以下 Stacktrace:
Sep 05, 2013 6:03:34 PM com.sun.faces.context.ExceptionHandlerImpl
log 1100: javax/enterprise/context/spi/Context
java.lang.NoClassDefFoundError: javax/enterprise/context/spi/Context
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:792)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2627)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:989)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1432)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1310)
at com.sun.faces.flow.FlowHandlerImpl.pushFlow(FlowHandlerImpl.java:374)
at com.sun.faces.flow.FlowHandlerImpl.transition(FlowHandlerImpl.java:278)
at com.sun.faces.flow.FlowHandlerImpl.clientWindowTransition(FlowHandlerImpl.java:321)
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:270)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:121)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
我的 pom 文件中描述了以下依赖项
<properties>
<org.springframework.version>3.2.3.RELEASE</org.springframework.version>
</properties>
<dependencies>
<!-- Spring framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- Spring MVC framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- JSR-330 -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- JSF -->
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.2.2</version>
</dependency>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
也许有人知道如何处理tomcat spring和jsf 2.2。
也许这也有帮助: 我没有向 tomcat lib 文件夹中添加任何内容,我只是将所有 jsf jar 添加到网络存档中,但这应该没有什么区别,因为这个类根本就不见了。
最佳答案
JSF 正在慢慢转向 CDI 作为 bean 管理。新的 JSF 2.2 @FlowScoped
注释是基于 CDI 的。 CDI 是 Java EE Web Profile 的一部分。这是开箱即用的真正 Java EE 容器,例如 TomEE , GlassFish , JBoss AS/EAP , WebSphere , WebLogic , Resin等,但不是通过准系统 JSP/Servlet 容器,例如 Tomcat和 Jetty .
Spring 本质上是 Java EE (CDI/EJB/JPA/JSF) 的全面竞争对手。您似乎选择了 Tomcat+Spring 而不是真正的 Java EE 容器。如果你出于某种不明确的原因想坚持使用 Spring,那么你应该使用 Spring Web Flow而不是 JSF Flow 范围。
但是如果您愿意替换 Tomcat+Spring,那么您也可以将其完全替换为上述 Java EE 容器之一。他们将开箱即用地提供 CDI/EJB/JPA(和 JSF)。如有必要,您可以轻松地将其捆绑的 JSF 实现升级到所需的 Mojarra 2.2.2 版本。确切的说明取决于所使用的容器。
另一种方法是在 Tomcat 中安装 CDI。 Weld(CDI 引用实现)有关于该主题的指南:Application servers and environments supported by Weld .
关于java - JSF 2.2 流程和 Tomcat 7 java.lang.NoClassDefFoundError : javax/enterprise/context/spi/Context,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18654762/