JSF 2.2流和Tomcat 7 java.lang.NoClassDefFoundError:javax / enterprise / context / spi / Context

时间:2013-09-06 09:44:49

标签: java spring jsf tomcat jsf-2.2

我尝试熟悉新的jsf 2.2功能,如页面流。所以我在Tomcat 7中完成了我的Project和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添加到web存档中,但这应该没有区别,因为该类完全没有。

2 个答案:

答案 0 :(得分:3)

JSF正在慢慢转向CDI进行bean管理。新的JSF 2.2 @FlowScoped注释是基于CDI的。 CDI是Java EE Web Profile的一部分。这是真正的Java EE容器提供的框,例如TomEEGlassFishJBoss AS/EAPWebSphereWebLogicResin等,但不是由TomcatJetty等准系统JSP / Servlet容器。

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

答案 1 :(得分:0)

较新版本的JSF期望或多或少的完整Web配置文件可用,并且tomcat没有提供。确切地说,它缺少CDI api,旁边你可能需要激活CDI实现(比如Weld或类似的人)。

JBoss网站this forum发布的一些信息。