【问题标题】:Spring and Hibernate messed up configuration filesSpring 和 Hibernate 搞砸了配置文件
【发布时间】:2015-12-17 12:08:44
【问题描述】:

从现在开始,我正在构建一个 Spring 4.1.7.RELEASE/Hibernate 4.2.7.Final/Mysql 5.1.27/Tomcat7 webapp,并且一直面临一些不是真正的 java 代码而是与配置相关的问题.我只是似乎无法理解那些 xml 文件和 bean 定义......今天我试图使用 JPA 为我的实体创建存储库,尽管它是非常简单的代码,但我无法摆脱这些问题。

我非常感谢在理解 bean 定义和清理我的 .xml 文件方面提供的帮助。

我遇到并再次遇到的错误:

**SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from ServletContext resource [/WEB-INF/root-context.xml]; nested exception is java.lang.NoSuchMethodError:     org.springframework.aop.config.AopNamespaceUtils.registerAutoProxyCreatorIfNecessary(Lorg/springframework/beans/factory/xml/ParserContext;Ljava/lang/Object;)V**

Caused by: java.lang.NoSuchMethodError:         org.springframework.aop.config.AopNamespaceUtils.registerAutoProxyCreatorIfNecessary(Lorg/springframework/beans/factory/xml/ParserContext;Ljava/lang/Object;)V**

SEVERE: Exception sending context destroyed event to listener instance of class org.springframework.web.context.ContextLoaderListener
java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext**

这是我的项目的 xml 文件:

调度程序-servlet.xml

   <!-- DispatcherServlet Context: defines this servlet's request-processing
          infrastructure -->

   <!-- Enables the Spring MVC @Controller programming model -->
   <bean:annotation-driven />
   <context:component-scan base-package="com.runninglife.controller" />

   <!-- Handles HTTP GET requests for /web-resources/** by efficiently serving
          up static resources in the ${webappRoot}/resources/ directory -->
   <bean:resources mapping="/web-resources/**" location="/resources/" />

   <!-- Resolves views selected for rendering by @Controllers to .jsp resources
          in the /WEB-INF/views directory -->

   <beans:bean
           class="org.springframework.web.servlet.view.InternalResourceViewResolver">
          <beans:property name="prefix" value="/WEB-INF/views/" />
          <beans:property name="suffix" value=".jsp" />
   </beans:bean>

    <!-- Apache Tiles Resolver & Config -->

<beans:bean id="tilesViewResolver"
      class="org.springframework.web.servlet.view.tiles3.TilesViewResolver">
</beans:bean>

<beans:bean id="tilesConfigurer"
      class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
    <beans:property name="definitions">
        <beans:list>
            <beans:value>/WEB-INF/tiles/tiles-definitions.xml</beans:value>
        </beans:list>
    </beans:property>
</beans:bean>

根上下文.xml

<!-- Root Context: defines shared resources visible to all other web components -->

<!-- JPA Context for Repository -->
<jpa:repositories base-package="com.runninglife.repository" />

<bean id="propertyConfigurer"
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

    <property name="locations">
        <list>
            <value>classpath:database.properties</value>
        </list>
    </property>
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
      destroy-method="close"
      p:driverClassName="${jdbc.driverClassName}"
      p:url="${jdbc.url}"
      p:username="${jdbc.username}"
      p:password="${jdbc.password}" />

<bean id="sessionFactory"
      class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="annotatedClasses">
        <list>
                <value>com.runninglife.entity.User</value>
        </list>
    </property>


    <property name="packagesToScan">
        <list>
            <value>com.runninglife.*</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">false</prop>
        </props>
    </property>
</bean>
<bean id="transactionManager"
      class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<context:component-scan base-package="com.runninglife" />

web.xml

<!-- The definition of the Root Spring Container shared by all Servlets
     and Filters -->

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/root-context.xml</param-value>
</context-param>

<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

<!-- Processes application requests -->
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/dispatcher-servlet.xml
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <!-- We can also use url-pattern like: *.html / *.htm / *.json etc. -->
    <url-pattern>/</url-pattern>
</servlet-mapping>

我在任何地方都找不到解决此问题的方法。

问候, 马特

【问题讨论】:

    标签: java xml spring hibernate spring-mvc


    【解决方案1】:

    经过大量研究后,我找到了问题的根源。

    虽然 spring 版本有点受到 jpa-data 依赖的“干扰”,但主要的困惑始于 root-context.xml,我误解了 entityManagerFactory 的实际想法,并在我尝试实现时使用了 hibernate sessionFactory JPA-Hibernate 方法具有: “ org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean ”。

    尽管如此,我还是为那些可能面临类似问题的人提供了正确的 root-context.xml 内容:

    从带有控制器的组件扫描开始排除(因为它们应该在调度程序 servlet 中):

    <context:component-scan base-package="GroupId of your Api">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    

    将例如 HSQL 用于开发者体育场:

    <jdbc:embedded-database type="HSQL" id="dataSource"/>
    

    剩下的和最重要的 jpa 实体管理器:

    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
        <property name="packagesToScan" value="PATH_TO_ENTITIES"/>
        <property name="dataSource" ref="dataSource"/>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">create</prop>
            </props>
        </property>
        <property name="persistenceProvider">
            <bean class="org.hibernate.jpa.HibernatePersistenceProvider" />
        </property>
    </bean>
    
    <!-- Transaction manager settings -->
    
    <tx:annotation-driven transaction-manager="transactionManager"/>
    
    <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    
    <!-- JPA Context for Repository -->
    <jpa:repositories base-package="PATH_TO_REPOSITORIES"
                      entity-manager-factory-ref="entityManagerFactory"
                      transaction-manager-ref="transactionManager"/>
    

    还有一个可能的解决方案是由于 data-jpa 造成的 spring-version 干扰。如果有人仍然有问题,请输入:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.6.RELEASE</version>
    </parent>
    

    在 pom.xml 中你的依赖堆栈之前,当然不要忘记添加 spring-boot-starter-data 依赖。

    就这些了。

    希望任何人都觉得它有用。 干杯!

    【讨论】:

      【解决方案2】:

      这看起来像是您的依赖项有问题。如果你没有使用像 Maven 这样的依赖管理工具,我建议你这样做。如果您尝试自己做,几乎不可能引入正确的依赖项。

      如果您使用的是依赖项管理工具,请确保您的类路径中的所有 Spring jar 都是相同的版本。

      【讨论】:

      • 我当然在使用 Maven,问题可能是尝试使用 JPA(当我添加到我的依赖项 spring-data-jpa、spring-jpa 和 aop 时——它的所有最新版本似乎以我在顶部提到的那些错误开始粉碎tomcat服务器)。添加 spring-data-jpa、spring-jpa 和 aop 可能会弄乱 Spring 版本 -> 它确实会下载一些“较旧”的 spring jar,但如果它们是最新版本,那么如何将它们与最新的 spring 版本一起使用呢? :/ 我只是卡住了 - 从没想过仅仅构建一些扩展 JPArepos 的存储库会如此痛苦......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多