posts - 167,  comments - 30,  trackbacks - 0
          項(xiàng)目組內(nèi)一位同事,在重構(gòu)代碼過(guò)程中將幾個(gè)模塊的Service層接口去掉后. 修改成了沒(méi)有實(shí)現(xiàn)任何接口的類(lèi),并且繼承了一個(gè)抽象基類(lèi)。
          然后我更新代碼后執(zhí)行系統(tǒng)中的該模塊,發(fā)現(xiàn)部分表數(shù)據(jù)沒(méi)有完整持久到數(shù)據(jù)庫(kù)中。看了下代碼和spring配置文件,原來(lái)調(diào)整后的Biz的業(yè)務(wù)類(lèi)沒(méi)有配置事務(wù)導(dǎo)致的。
          修改了下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>

          啟動(dòng)tomcat后報(bào)出如下錯(cuò)誤信息:
          [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
          嚴(yán)重: 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

          ------------------------------------------
          通過(guò)以上錯(cuò)誤分析之:對(duì)于實(shí)現(xiàn)了接口的類(lèi),直接用了JDK的動(dòng)態(tài)代理,把目標(biāo)對(duì)象扔給JDK的Proxy,拿到代理對(duì)象就OK了。然而對(duì)于沒(méi)有實(shí)現(xiàn)接口的類(lèi),Spring借助于CGLIB來(lái)實(shí)現(xiàn)代理。
          解決辦法:
          當(dāng)使用CGLIB來(lái)實(shí)現(xiàn)代理后,沒(méi)有實(shí)現(xiàn)接口的類(lèi)
          1、 通過(guò)構(gòu)造函數(shù)形式注入時(shí)必須有默認(rèn)的構(gòu)造函數(shù),否則就會(huì)出現(xiàn)上面的異常。
          2、通過(guò)生產(chǎn)setter或者getter方法注入。
          3、通過(guò)修改Spring的CglibProxyFactory工廠類(lèi)。

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

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

          常用鏈接

          留言簿(4)

          隨筆分類(lèi)

          隨筆檔案

          文章檔案

          新聞分類(lèi)

          新聞檔案

          相冊(cè)

          收藏夾

          Java

          Linux知識(shí)相關(guān)

          Spring相關(guān)

          云計(jì)算/Linux/虛擬化技術(shù)/

          友情博客

          多線程并發(fā)編程

          開(kāi)源技術(shù)

          持久層技術(shù)相關(guān)

          搜索

          •  

          積分與排名

          • 積分 - 359952
          • 排名 - 154

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 巴南区| 宁南县| 闻喜县| 故城县| 滦平县| 若尔盖县| 孙吴县| 长顺县| 福海县| 武川县| 辽源市| 大余县| 宣恩县| 普格县| 墨脱县| 永福县| 神农架林区| 亳州市| 盐山县| 武强县| 镇安县| 荔波县| 南乐县| 西乌珠穆沁旗| 金寨县| 尼木县| 雷山县| 呼伦贝尔市| 呼和浩特市| 洱源县| 惠东县| 同仁县| 陈巴尔虎旗| 满城县| 恩施市| 隆昌县| 六枝特区| 米泉市| 定西市| 班玛县| 泸西县|