之前也发过类似帖子,不过以前是用Struts1的方式整合,现在改为Struts2,但是用以前的方式就出现问题了。
首先必须说明的是,如果不用延迟加载,整个项目是正常运行的第一步,放上web.xml配置的延迟加载配置   <filter>  
    <description>  
    延长hibernate中session的生命周期   
    </description>  
    <filter-name>OpenSessionInView</filter-name>  
    <filter-class>  
         org.springframework.orm.hibernate3.support.OpenSessionInViewFilter   
    </filter-class>
    <init-param>     
         <param-name>flushMode</param-name>     
         <param-value>AUTO</param-value>     
    </init-param>    
    <init-param>     
         <param-name>singleSession</param-name>     
         <param-value>true</param-value>     
    </init-param>   
      
</filter> <filter-mapping>  
    <filter-name>OpenSessionInView</filter-name>  
    <url-pattern>/*</url-pattern>  
  </filter-mapping> <!-- 加载Spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>该代码用上后,整个项目能正常运行,并且可以进行延迟加载,但是无法删除和修改,因为没有进行事务配置。
第二步:对applicationContext.xml进行事务配置:  <!-- 声明一个事务管理器,并注入sessionFactory属性 -->
    <bean id="myHibTxManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
   

<!-- 定义事务通知,并制定一个事务管理器,然后在属性中声明事务规则 -->
    <tx:advice id="txAdvice" transaction-manager="myHibTxManager">
      <tx:attributes>
         <tx:method name="add*"  propagation="REQUIRED"/>
         <tx:method name="del*"  propagation="REQUIRED"/>
         <tx:method name="update*"  propagation="REQUIRED"/>
         <tx:method name="do*"  propagation="REQUIRED"/>
         <tx:method name="*" propagation="REQUIRED" read-only="true"/>
      </tx:attributes>
    </tx:advice>
    
     <aop:config>
<!-- 定义一个切面,表示对biz包下的所有以Impl结尾的类的所有方法都应用事务规则-->
<aop:pointcut id="bizMethods"
expression="execution(* biz.*.*Impl.*(..))" />
<!--  将事务通知与切面组合  -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="bizMethods" />
</aop:config> 然后运行项目,出现错误,提示严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor': Instantiation of bean failed; nested exception is java.lang.AbstractMethodError: org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.determineConstructor(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Constructor;
Caused by: java.lang.AbstractMethodError: org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.determineConstructor(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Constructor;
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:743)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:716)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:387)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:156)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
at org.springframework.aop.framework.autoproxy.BeanFactoryAdvisorRetrievalHelper.findAdvisorBeans(BeanFactoryAdvisorRetrievalHelper.java:87)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findCandidateAdvisors(AbstractAdvisorAutoProxyCreator.java:98)
at org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.shouldSkip(AspectJAwareAdvisorAutoProxyCreator.java:105)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(AbstractAutoProxyCreator.java:281)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:689)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:369)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:156)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:287)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:244)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:187)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3972)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4467)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1041)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:964)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:321)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:519)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
2012-2-3 20:33:14 org.apache.catalina.core.StandardContext start
严重: Error listenerStart
2012-2-3 20:33:14 org.apache.catalina.core.StandardContext start
严重: Context [/fangwuxinxin_ssh2] startup failed due to previous errors
2012-2-3 20:33:14 org.apache.catalina.core.ApplicationContext log
信息: Closing Spring root WebApplicationContext
log4j:WARN No appenders could be found for logger (com.opensymphony.xwork2.config.providers.XmlConfigurationProvider).
log4j:WARN Please initialize the log4j system properly.英文不好,自己判断为是否事务处理出错或缺少相应包。在以上配置的基础上,在DAO和BIZ层直接用main方法测试,发现可以进行正常的增删改查操作,表明applicationContext.xml没有配置错误。
问题在于:为什么无论是web.xml的配置还是applicationContext.xml似乎都没有问题,但同时配置上去之后,却无法让项目正常运行呢?
急求解答,谢谢各位

解决方案 »

  1.   

    补充,该项目用的是Struts2.0+hibernate3.2.6+spring2.5.6
    提供完整的applicationContext.xml配置<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"  
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
           xmlns:context="http://www.springframework.org/schema/context"  
           xmlns:aop="http://www.springframework.org/schema/aop"  
           xmlns:tx="http://www.springframework.org/schema/tx"  
           xsi:schemaLocation="http://www.springframework.org/schema/beans  
               http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
               http://www.springframework.org/schema/context  
               http://www.springframework.org/schema/context/spring-context-2.5.xsd  
               http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
               http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">      <bean id="dataSource"  class="org.apache.commons.dbcp.BasicDataSource"
       destroy-method="close">
           <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
           <property name="url" value="jdbc:sqlserver://localhost:1433;DatabaseName=zf" />
           <property name="username" value="sa" />
           <property name="password" value="123" />
       </bean>  
          <bean id="sessionFactory"
           class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
           <property name="dataSource" ref="dataSource" />
           <property name="mappingResources">
               <list>
             <value>entity/Admin.hbm.xml</value>
             <value>entity/Fwxx.hbm.xml</value>
             <value>entity/Fwlx.hbm.xml</value>
             <value>entity/Jd.hbm.xml</value>
             <value>entity/Qx.hbm.xml</value>          
              </list>
           </property>
           <property name="hibernateProperties">
               <props>
              <prop key="hibernate.dialect">
                   org.hibernate.dialect.SQLServerDialect
              </prop>
              <prop key="hibernate.show_sql">true</prop>
               </props>
           </property>
        </bean> 
        
        
        <!-- 声明一个事务管理器,并注入sessionFactory属性 -->
        <bean id="myHibTxManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
    </bean>
       

    <!-- 定义事务通知,并制定一个事务管理器,然后在属性中声明事务规则 -->
        <tx:advice id="txAdvice" transaction-manager="myHibTxManager">
          <tx:attributes>
             <tx:method name="add*"  propagation="REQUIRED"/>
             <tx:method name="del*"  propagation="REQUIRED"/>
             <tx:method name="update*"  propagation="REQUIRED"/>
             <tx:method name="do*"  propagation="REQUIRED"/>
             <tx:method name="*" propagation="REQUIRED" read-only="true"/>
          </tx:attributes>
        </tx:advice>
        
         <aop:config>
    <!-- 定义一个切面,表示对biz包下的所有以Impl结尾的类的所有方法都应用事务规则-->
    <aop:pointcut id="bizMethods"
    expression="execution(* biz.*.*Impl.*(..))" />
    <!--  将事务通知与切面组合  -->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="bizMethods" />
    </aop:config>  
    </beans>
      

  2.   

    再次补充,把web.xml里延迟 加载的代码去掉,运行整个项目还是出现相同的错误提示。
    这样就意味着还是事务处理这段代码的问题
    但问题是,applicationContext.xml文件为什么在在DAO和BIZ层直接用main方法测试,又进行正常执行增删改查操作而不提示xml文件错误呢。