【问题标题】:ContextLoaderListener error using Spring MVC and Hibernate with JPA使用 Spring MVC 和 Hibernate 与 JPA 的 ContextLoaderListener 错误
【发布时间】:2014-02-05 18:48:39
【问题描述】:

我研究并尝试了有关此问题的其他问题的解决方案,但没有成功(例如下面的线程)

java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

我是一名 .NET 开发人员,正在尝试使用我当前的项目切换到 JAVA。我正在使用 JPA 作为我的数据存储库层(使用 Maven)使用 Hibernate 配置 Spring MVC 项目。我已经配置了所需的文件(web.xml、pom 文件、jpa 上下文文件等)。但是,将其部署到 TomCat Apache 服务器后,我收到一条错误消息,指出配置应用程序侦听器时出现问题。

我尝试了一些步骤:

  1. 我的 Spring Maven 依赖项被列为编译而不是提供
  2. 我在构建路径中包含了 Maven 依赖项
  3. 我已经使用 Maven 菜单更新了项目
  4. 我检查以确保 Spring Web 依赖项包含在依赖关系层次结构中

有人能帮我解决这个问题吗?提前谢谢!

完整的错误:

SEVERE: Error configuring application listener of class org.springframework.web.context.contextLoaderListener java.lang.ClassNotFoundException: org.springframework.web.context.contextLoaderListener at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547) at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:532) at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:514) at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:142) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4854) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

这似乎是一个相当常见的错误 - 然而,迄今为止提出的解决方案都没有奏效。

下面是我的 Pom 文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>mil.navy.navsupbsc.contacts</groupId>
    <artifactId>contacts</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>contacts Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <properties>

    <junit.version>4.11</junit.version>
    <spring.version>3.2.0.RELEASE</spring.version>
    <jackson.version>1.9.10</jackson.version>
    <hibernateValidator.version>4.2.0.Final</hibernateValidator.version>
    <commonsDbcp.version>1.4</commonsDbcp.version>
    <hibernateEntityManager.version>4.1.9.Final</hibernateEntityManager.version>
    <javaxTransactionJta.version>1.1</javaxTransactionJta.version>
</properties>
<dependencies>
    <!-- Added this dependency due to web search solutions for this problem -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>${commonsDbcp.version}</version>
    </dependency>
    <!-- Spring 3 dependencies -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>${hibernateValidator.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
        <scope>compile</scope>
    </dependency>
    <!-- Jackson JSON Mapper -->
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>${jackson.version}</version>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>

    <!-- JPA Dependencies -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>${hibernateEntityManager.version}</version>
    </dependency>
    <dependency>
        <groupId>javax.transaction</groupId>
        <artifactId>jta</artifactId>
        <version>${javaxTransactionJta.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${spring.version}</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!-- Oracle Dependencies -->
</dependencies>
<build>
    <finalName>contacts</finalName>
</build>
</project>

还有我的 web.xml 文件:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
<display-name>Archetype Created Web Application</display-name>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:/jpaContext.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.contextLoaderListener</listener-class>
</listener>
<servlet>
    <servlet-name>Contact</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Contact</servlet-name>
    <url-pattern>*.json</url-pattern>
</servlet-mapping>
    <servlet-mapping>
    <servlet-name>Contact</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>

我的 persistence.xml 文件

<persistence xmlns="http://java.sun.com/xml/ns/persistence/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence_2_0.xsd"
    version="2.0">

<persistence-unit name="punit">

</persistence-unit>

</persistence>

我的 jpa 上下文文件:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

<context:annotation-config />

<bean
    class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="punit" />
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true" />
        </bean>
    </property>
    <property name="jpaPropertyMap">
        <map>
            <entry key="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
            <entry key="hibernate.hbm2ddl.auto" value="none" />
            <entry key="hibernate.format_sql" value="true" />
        </map>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
    <property name="url"
        value="jdbc:oracle:thin:@//###.###.##.##:####/xxxxx" />
    <property name="username" value="xxxxx" />
    <property name="password" value="xxxxx"/>
</bean>

【问题讨论】:

    标签: spring hibernate spring-mvc jpa


    【解决方案1】:

    我认为您的 web.xml 定义中有错字。应该是

    org.springframework.web.context.ContextLoaderListener
    

    大写C

    所以基本上,这个..

    <listener>
        <listener-class>org.springframework.web.context.contextLoaderListener</listener-class>
    </listener>
    

    必须是

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    

    【讨论】:

    • 非常感谢!看起来这修复了我提到的错误(我很快就会将您的错误标记为答案)。但与此同时 - 它又增加了一个错误。我可能需要为它创建一个新问题,因为它不同 - 但也许你会知道它的答案?这是错误:属性'driverClassName'抛出异常;嵌套异常是 java.lang.IllegalStateException:无法加载 JDBC 驱动程序类 [oracle.jdbc.OracleDriver] 我将其添加为外部 jar 引用而不是外部 Maven 存储库。它包含在构建路径中。
    • 你为什么将它添加为外部 jar。 IllegalStateException 看起来确实是类路径中不存在的 jar 文件,但是为什么不将其添加为 Maven 依赖项呢?这不是更易于管理吗?
    • 使用它来找出你需要的 ojdbc 的依赖。 search.maven.org/#search%7Cga%7C1%7Cojdbc
    • 老实说,我没有使用它,因为我在使用本地存储库时遇到了麻烦。我想使用 Ojdbc6 而不是 ojdbc14 - 我读到的所有内容都说它必须安装在本地存储库中或使用 mvn install。我使用以下命令进行了 MVN 安装(mvn install:install-file -Dfile={C:\Users\zm09440\Downloads\ojdbc6.jar} -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.3 - Dpackaging=jar -Dfile=ojdbc6.jar -DgeneratePom=true)。然而,每次我这样做时,它什么也没做。我可能错过了一个基本概念,但自从我被卡住后就走了另一条路。
    • 好吧,基本上 maven install 所做的与您实际将其指定为项目中的依赖项时会发生的情况相同。 maven 安装会强制从外部存储库中提取 jar 文件并将其放入您的 .m2 文件夹(存储库)中。默认情况下位于 C:\Users\\.m2 中。您可以通过在 mavenrepository.com 上搜索将 ojdbc6 添加为依赖项,然后复制 sn-p 并将其添加到您的 pom.xml 中。右键单击您的 Eclipse 项目,例如 Maven --> 更新依赖项,它应该为您下载它
    猜你喜欢
    • 2013-12-15
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 2019-10-27
    • 1970-01-01
    相关资源
    最近更新 更多