【问题标题】:JSF 2.2 Flows and Tomcat 7 java.lang.NoClassDefFoundError: javax/enterprise/context/spi/ContextJSF 2.2 流和 Tomcat 7 java.lang.NoClassDefFoundError: javax/enterprise/context/spi/Context
【发布时间】:2013-09-06 09:44:49
【问题描述】:

我尝试熟悉新的 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 添加到 web 存档中,但这应该没有什么区别,因为该类完全丢失了。

【问题讨论】:

    标签: java spring jsf tomcat jsf-2.2


    【解决方案1】:

    JSF 在 bean 管理方面正慢慢转向 CDI。新的 JSF 2.2 @FlowScoped 注释是基于 CDI 的。 CDI 是 Java EE Web Profile 的一部分。这是真正的 Java EE 容器(例如 TomEEGlassFishJBoss AS/EAPWebSphereWebLogicResin 等)提供的开箱即用,但不是由准系统 JSP/Servlet 容器(例如 @)提供987654327@和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

    【讨论】:

    • 感谢您的描述,我知道 Spring Web Flow 以及 ee 技术,但我喜欢查看问题中已经描述的新技术。我不同意将 spring 和 tomcat 放在一起的原因不明的描述,我从双方都知道关于 EJB 与 Spring 的宗教问题,在我看来这只是一个需求问题,但现在已经很远了。我将测试焊接的集成,所以谢谢你的建议。
    【解决方案2】:

    较新版本的 JSF 期望或多或少有一个完整的 Web 配置文件可用,而 tomcat 不提供该配置文件。确切地说,它缺少 CDI api,旁边您可能需要激活 CDI 实现(如 Weld 等)。

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

    【讨论】:

      猜你喜欢
      • 2015-03-31
      • 2021-09-02
      • 2014-10-13
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 2017-02-19
      • 2014-04-15
      相关资源
      最近更新 更多