posts - 167,  comments - 30,  trackbacks - 0
          項目組內一位同事,在重構代碼過程中將幾個模塊的Service層接口去掉后. 修改成了沒有實現任何接口的類,并且繼承了一個抽象基類。
          然后我更新代碼后執行系統中的該模塊,發現部分表數據沒有完整持久到數據庫中。看了下代碼和spring配置文件,原來調整后的Biz的業務類沒有配置事務導致的。
          修改了下spring配置文件(beanNames綁定了*Biz):
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
              <bean id= "propertyConfigurer"          
                  class 
          = "com.ccms.base.util.DecryptPropertyPlaceholderConfigurer" >          
               <property name="locations" value= "classpath:sysConfig.properties" />          
             </bean>      
              <!-- 
             <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
                  destroy-method="close">
                  <property name="driverClassName">
                      <value>com.mysql.jdbc.Driver</value>
                  </property>
                  <property name="url">
                      <value>${dataSource.jdbcUrl}&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
                  </property>
                  <property name="username">
                      <value>${dataSource.userName}</value>
                  </property>
                  <property name="password">
                      <value>${dataSource.password}</value>
                  </property>
                  <property name="maxActive">
                      <value>100</value>
                  </property>
                  <property name="initialSize">
                      <value>5</value>
                  </property>
                  <property name="maxIdle">
                      <value>10</value>
                  </property>
                  <property name="minIdle">
                      <value>0</value>
                  </property>
                  <property name="maxWait">
                      <value>-1</value>
                  </property>
                  <property name="defaultAutoCommit">
                      <value>false</value>
                  </property>
                  <property name="testOnBorrow">
                      <value>true</value>
                  </property>
                  <property name="testWhileIdle">
                      <value>true</value>
                  </property>
                  <property name="timeBetweenEvictionRunsMillis">
                      <value>600000</value>
                  </property>
                  <property name="numTestsPerEvictionRun">
                      <value>20</value>
                  </property>
                  <property name="minEvictableIdleTimeMillis">
                      <value>3600000</value>
                  </property>
              </bean>
             
          -->
              <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" >
                  <property name="driverClass" value="com.mysql.jdbc.Driver" />
                  <property name="jdbcUrl" value="${dataSource.jdbcUrl}&amp;useUnicode=true&amp;characterEncoding=UTF-8" />
                  <property name="user" value="${dataSource.userName}" />
                  <property name="password" value="${dataSource.password}" />
                    <property name="minPoolSize" value="5" />
                  <property name="maxPoolSize" value="50" />
                  <property name="maxStatements" value="0" />
                  <property name="idleConnectionTestPeriod" value="60" />
                  <property name="acquireRetryAttempts" value="3" />
              </bean>

              <!-- Session Factory -->
              <bean id="sessionFactory"
                  class
          ="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
                  <property name="dataSource">
                      <ref local="dataSource" />
                  </property>
              <!-- hbm配置文件的classPath路徑 -->
                  <property name="mappingDirectoryLocations">
                      <list>
                          <value>classpath:/com/ccms/base/mapping</value>
                      </list>
                  </property>

                  <property name="hibernateProperties">
                      <props>
                          <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                          <prop key="hibernate.show_sql">true</prop>
                          <prop key="hibernate.generate_statistics">true</prop>
                          <prop key="hibernate.connection.release_mode">auto</prop>
                          <prop key="hibernate.autoReconnect">true</prop> 
                          <prop key="hibernate.connection.autocommit">false</prop>
                          <!-- <prop key="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</prop> -->
                      </props>
                  </property>
              </bean>

              <bean id="myTransactionManager"
                  class
          ="org.springframework.orm.hibernate3.HibernateTransactionManager">
                  <property name="sessionFactory">
                      <ref bean="sessionFactory" />
                  </property>
              </bean> 

              <bean id="transactionInterceptor"
                  class
          ="org.springframework.transaction.interceptor.TransactionInterceptor">
                  <property name="transactionManager" ref="myTransactionManager" />
                  <property name="transactionAttributes">
                      <props>
                          <prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
                      </props>
                  </property>
              </bean>
              <bean  class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
                  <property name="transactionInterceptor"
                      ref
          ="transactionInterceptor" />
              </bean>
              <bean
                  
          class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
                  <property name="beanNames">
                      <list>
                          <value>*Service</value>
                          <value>*Biz</value>
                      </list>
                  </property>
                  <property name="interceptorNames">
                      <list>
                          <value>transactionInterceptor</value>
                      </list>
                  </property>
              </bean>
          </beans>

          啟動tomcat后報出如下錯誤信息:
          [2013-03-05 10:36:56] [ERROR] Context initialization failed - at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:215) 
          org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginBiz' defined in ServletContext resource [/WEB-INF/spring-service-resource.xml]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.ccms.login.LoginBiz]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:445)
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:383)
          at java.security.AccessController.doPrivileged(Native Method)
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:353)
          at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)
          at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:169)
          at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
          at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
          at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:400)
          at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:736)
          at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:369)
          at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261)
          at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
          at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
          at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135)
          at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
          at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
          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:445)
          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)
          Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.ccms.login.LoginBiz]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
          at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:213)
          at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110)
          at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:433)
          at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:299)
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:331)
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1266)
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:438)
          ... 28 more
          Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
          at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:718)
          at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:499)
          at net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)
          at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
          at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
          at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
          at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
          at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:201)
          ... 34 more
          2013-3-5 10:36:56 org.apache.catalina.core.StandardContext listenerStart
          嚴重: 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 'loginBiz' defined in ServletContext resource [/WEB-INF/spring-service-resource.xml]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.ccms.login.LoginBiz]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:445)
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:383)
          at java.security.AccessController.doPrivileged(Native Method)
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:353)
          at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)
          at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:169)
          at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
          at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
          at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:400)
          at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:736)
          at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:369)
          at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261)
          at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
          at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
          at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135)
          at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
          at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
          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:445)
          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)
          Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.ccms.login.LoginBiz]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
          at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:213)
          at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110)
          at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:433)
          at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:299)
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:331)
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1266)
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:438)
          ... 28 more
          Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
          at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:718)
          at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:499)
          at net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)
          at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
          at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
          at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
          at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
          at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:201)
          ... 34 more
          2013-3-5 10:36:56 org.apache.catalina.core.StandardContext start

          ------------------------------------------
          通過以上錯誤分析之:對于實現了接口的類,直接用了JDK的動態代理,把目標對象扔給JDK的Proxy,拿到代理對象就OK了。然而對于沒有實現接口的類,Spring借助于CGLIB來實現代理。
          解決辦法:
          當使用CGLIB來實現代理后,沒有實現接口的類
          1、 通過構造函數形式注入時必須有默認的構造函數,否則就會出現上面的異常。
          2、通過生產setter或者getter方法注入。
          3、通過修改Spring的CglibProxyFactory工廠類。

          詳細解析可以參照這篇文章:http://netfork.iteye.com/blog/286215
          posted on 2013-03-05 14:54 David1228 閱讀(10770) 評論(0)  編輯  收藏 所屬分類: SpringJ2EE

          <2013年3月>
          242526272812
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          文章檔案

          新聞分類

          新聞檔案

          相冊

          收藏夾

          Java

          Linux知識相關

          Spring相關

          云計算/Linux/虛擬化技術/

          友情博客

          多線程并發編程

          開源技術

          持久層技術相關

          搜索

          •  

          積分與排名

          • 積分 - 358877
          • 排名 - 154

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 营口市| 芒康县| 益阳市| 靖江市| 墨江| 徐汇区| 营山县| 辽阳市| 隆林| 冕宁县| 南漳县| 广水市| 滁州市| 新疆| 蓬莱市| 普陀区| 娄底市| 隆化县| 岳池县| 虎林市| 深泽县| 孟津县| 同德县| 清水河县| 环江| 旅游| 柳江县| 定州市| 德安县| 万年县| 玉山县| 武安市| 旬邑县| 阳曲县| 茶陵县| 温泉县| 六枝特区| 青神县| 穆棱市| 资阳市| 绍兴县|