Spring+Hibernate事务处理,很简单的例子出错

   项目第一次使用SSH,于是准备先做个Demo出来,就是想实现用户注册和登录,可是在持久化时就是遇到了问题。
   这个问题困扰了我和跟我pair的兄弟一天了,试验了几种方法,代码和Spring开发参考手册上的基本上一样,也用过其他人的方法,别人的程序在我的环境下没有问题,仿照他们的代码自己编一个就不行,几种方法的共性问题是:
     java.lang.NoSuchMethodError: org.springframework.util.ClassUtils.isPresent(Ljava/lang/String;)Z
    不同的方法会有不同的错误呈现,然而总是会出现这句话。
     我使用MyEclipse5.1的add spring capabilities和add hibernate capabilities自动生成的POJO和mapping文件,一切顺利,如下所示:

java 代码
  1. default package  
  2.   
  3.     
  4.   
  5. /**  
  6.  * User generated by MyEclipse - Hibernate Tools  
  7.  */  
  8.   
  9. public class User  implements java.io.Serializable {   
  10.   
  11.   
  12.     // Fields       
  13.   
  14.      private String userID;   
  15.      private String userName;   
  16.      private String password;   
  17.   
  18.   
  19.     // Constructors   
  20.   
  21.     /** default constructor */  
  22.     public User() {   
  23.     }   
  24.   
  25.        
  26.     /** full constructor */  
  27.     public User(String userID, String userName, String password) {   
  28.         this.userID = userID;   
  29.         this.userName = userName;   
  30.         this.password = password;   
  31.     }   
  32.   
  33.       
  34.     // Property accessors   
  35.   
  36.     //省略存取器方法   
  37.   
  38. }   


  

 

java 代码
  1. // default package      
  2.      
  3. import java.util.List;      
  4. import org.apache.commons.logging.Log;      
  5. import org.apache.commons.logging.LogFactory;      
  6. import org.hibernate.LockMode;      
  7. import org.springframework.context.ApplicationContext;      
  8. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;      
  9.      
  10.      
  11. /**    
  12.  * Data access object (DAO) for domain model class User.    
  13.  * @see .User    
  14.  * @author MyEclipse - Hibernate Tools    
  15.  */     
  16. public class UserDAO extends HibernateDaoSupport {      
  17.      
  18.     private static final Log log = LogFactory.getLog(UserDAO.class);      
  19.      
  20.      
  21.  protected void initDao() {      
  22.   //do nothing      
  23.  }      
  24.           
  25.     public void save(User transientInstance) {      
  26.         log.debug("saving User instance");      
  27.          
  28.      
  29.         try {      
  30.             getHibernateTemplate().save(transientInstance);      
  31.             log.debug("save successful");      
  32.         } catch (RuntimeException re) {      
  33.             log.error("save failed", re);      
  34.                      throw re;      
  35.         }      
  36.   
  37.   public static UserDAO getFromApplicationContext(ApplicationContext ctx) {   
  38.      return (UserDAO) ctx.getBean("UserDAO");   
  39.  }   
  40.      
  41.     }     

 之后是配置文件:hibernate.cfg.xml

xml 代码
  1. <?xml version='1.0' encoding='UTF-8'?>  
  2. <!DOCTYPE hibernate-configuration PUBLIC   
  3.           "-//Hibernate/Hibernate Configuration DTD 3.0//EN"   
  4.           "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  5.   
  6. <!-- Generated by MyEclipse Hibernate Tools.                   -->  
  7. <hibernate-configuration>  
  8.   
  9.     <session-factory>  
  10.         <property name="connection.username">SOMIS</property>  
  11.         <property name="connection.url">  
  12.             jdbc:oracle:thin:@127.0.0.1:1521:ORA92   
  13.         </property>  
  14.         <property name="dialect">  
  15.             org.hibernate.dialect.Oracle9Dialect   
  16.         </property>  
  17.         <property name="myeclipse.connection.profile">SOMIS</property>  
  18.         <property name="connection.password">ss</property>  
  19.         <property name="connection.driver_class">  
  20.             oracle.jdbc.driver.OracleDriver   
  21.         </property>  
  22.         <mapping resource="User.hbm.xml" />  
  23.   
  24.     </session-factory>  
  25.   
  26. </hibernate-configuration>  

 spring的配置文件,applicationContext.xml

xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3.   
  4. <beans>  
  5.   
  6.   
  7.     <bean id="sessionFactory"  
  8.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  9.         <property name="configLocation">  
  10.             <value>file:src/hibernate.cfg.xml</value>  
  11.         </property>  
  12.     </bean>  
  13.     <bean id="UserDAO" class="UserDAO">  
  14.         <property name="sessionFactory">  
  15.             <ref bean="sessionFactory" />  
  16.         </property>     
  17.            
  18.     </bean>  
  19.        
  20.   
  21. </beans>  

以下是测试代码:

java 代码
  1. import org.springframework.context.ApplicationContext;   
  2. import org.springframework.context.support.ClassPathXmlApplicationContext;   
  3.   
  4. import junit.framework.TestCase;   
  5.   
  6.   
  7. public class UserDAOTest extends TestCase {   
  8.   
  9.     public void testSave() {   
  10.   
  11.         ApplicationContext ctx = new ClassPathXmlApplicationContext( new  
  12.                    String[] { "applicationContext.xml" });   
  13.         
  14.            
  15.         UserDAO userDAO=UserDAO.getFromApplicationContext(ctx);   
  16.         User user=new User();   
  17.         user.setPassword("123");   
  18.         user.setUserID("1");   
  19.         user.setUserName("admin");   
  20.         userDAO.save(user);   
  21.     }   
  22.   
  23. }   

        这时测试可以通过(使用Spring自带的测试类也测试过)。

      然后在配置文件中加入声明式事务处理,测试就通不过了。

xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3.   
  4. <beans>  
  5.   
  6.   
  7.     <bean id="sessionFactory"  
  8.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  9.         <property name="configLocation">  
  10.             <value>file:src/hibernate.cfg.xml</value>  
  11.         </property>  
  12.     </bean>  
  13.     <bean id="UserDAO" class="UserDAO">  
  14.         <property name="sessionFactory">  
  15.             <ref bean="sessionFactory" />  
  16.         </property>     
  17.            
  18.     </bean>  
  19.        
  20.      <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  21.        <property name="sessionFactory"><ref bean="sessionFactory"/></property>  
  22.     </bean>  
  23.        
  24.    <bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
  25.         <property name="transactionManager" >  
  26.             <ref bean="transactionManager"/>  
  27.         </property>  
  28.         <property name="target">  
  29.             <ref bean="UserDAO"/>  
  30.         </property>  
  31.         <property name="transactionAttributes">  
  32.              <props>  
  33.                 <prop key="save">PROPAGATION_REQUIRED</prop>  
  34.              </props>  
  35.         </property>  
  36.     </bean>     
  37. </beans>  

        这是很平常的写法了,可是就是不知道为什么会报下面的错误:      

  1. org.springframework.beans.factory.BeanCreationException: Error 
  2. creating bean with name 'userDAOProxy' defined in class path
  3.  resource [applicationContext.xml]: Instantiation of bean failed;
  4.  nested exception is org.springframework.beans.BeanInstantiationException:
  5.  Could not instantiate bean class [org.springframework.transaction.interceptor.TransactionProxyFactoryBean]:
  6.  Constructor threw exception; nested exception is java.lang.NoSuchMethodError: 
  7. org.springframework.util.ClassUtils.isPresent(Ljava/lang/String;)Z   
  8. org.springframework.beans.BeanInstantiationException: 
  9. Could not instantiate bean class [org.springframework.transaction.interceptor.TransactionProxyFactoryBean]: 
  10. Constructor threw exception; nested exception is java.lang.NoSuchMethodError: 
  11. org.springframework.util.ClassUtils.isPresent(Ljava/lang/String;)Z   
  12. java.lang.NoSuchMethodError: org.springframework.util.ClassUtils.isPresent(Ljava/lang/String;)Z   
  13.     at org.springframework.aop.framework.DefaultAopProxyFactory.<clinit>(DefaultAopProxyFactory.java:56)   
  14.     at org.springframework.aop.framework.ProxyConfig.<init>(ProxyConfig.java:63)   
  15.     at org.springframework.aop.framework.AbstractSingletonProxyFactoryBean.<init>(AbstractSingletonProxyFactoryBean.java:39)   
  16.     at org.springframework.transaction.interceptor.TransactionProxyFactoryBean.<init>(TransactionProxyFactoryBean.java:105)   
  17.     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)   
  18.     at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)   
  19.     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)   
  20.     at java.lang.reflect.Constructor.newInstance(Unknown Source)   
  21.     at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:171)   
  22.     at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)   
  23.     at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:52)   
  24.     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:486)   
  25.     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:362)   
  26.     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:233)   
  27.     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:145)   
  28.     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:277)   
  29.     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:313)   
  30.     at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:87)   
  31.     at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:72)   
  32.     at UserDAOTest.testSave(UserDAOTest.java:11)   
  33.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)   
  34.     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)   
  35.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)   
  36.     at java.lang.reflect.Method.invoke(Unknown Source)   
  37.     at junit.framework.TestCase.runTest(TestCase.java:154)   
  38.     at junit.framework.TestCase.runBare(TestCase.java:127)   
  39.     at junit.framework.TestResult$1.protect(TestResult.java:106)   
  40.     at junit.framework.TestResult.runProtected(TestResult.java:124)   
  41.     at junit.framework.TestResult.run(TestResult.java:109)   
  42.     at junit.framework.TestCase.run(TestCase.java:118)   
  43.     at junit.framework.TestSuite.runTest(TestSuite.java:208)   
  44.     at junit.framework.TestSuite.run(TestSuite.java:203)   
  45.     at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128)   
  46.     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)   
  47.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)   
  48.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)   
  49.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)   
  50.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)  


         后来我又使用了编程式事务处理,直接报错就是

       java.lang.NoSuchMethodError: org.springframework.util.ClassUtils.isPresent(Ljava/lang/String;)Z

        使用声明式事务处理也试过下面的代码:

xml 代码
  1. <!--事务拦截器,激活事务管理器所必须的bean-->  
  2.      <bean id="transactionInterceptor"    
  3.   
  4. class="org.springframework.transaction.interceptor.TransactionInterceptor">  
  5.         <!--  事务拦截器bean需要依赖注入一个事务管理器 -->  
  6.         <property name="transactionManager" ref="transactionManager"/>  
  7.         <property name="transactionAttributes">  
  8.             <!--  下面定义事务传播属性-->  
  9.             <props>  
  10.                 <!--PROPAGATION_REQUIRE规则表示:在bean中所有以get开头的方法,当抛出异   
  11.   
  12. 常时,自动回滚,并只读,其他异常自动回滚-->  
  13.                 <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>  
  14.                 <prop key="*">PROPAGATION_REQUIRED</prop>  
  15.             </props>  
  16.         </property>  
  17.     </bean>  
  18.   
  19.     <!--定义事务处理代理bean,他需要两个属性,一个是指定需要代理的bean,另一个是代理bean所需的   
  20.   
  21. 事务拦截器-->  
  22.     <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
  23.         <!--  指定对满足哪些bean name的bean自动生成业务代理 -->  
  24.         <property name="beanNames">  
  25.             <!--  下面是所有需要自动创建事务代理的bean-->  
  26.             <list>  
  27.                 <value>UserDAO</value>  
  28.             </list>  
  29.             <!--  此处可增加其他需要自动创建事务代理的bean-->  
  30.         </property>  
  31.         <!--  下面定义BeanNameAutoProxyCreator所需的事务拦截器-->  
  32.         <property name="interceptorNames">  
  33.             <list>  
  34.                 <!-- 此处可增加其他新的Interceptor -->  
  35.                 <value>transactionInterceptor</value>    
  36.             </list>  
  37.         </property>  
  38.     </bean>          

                 依然报错,不知道怎么办了。

               在Google,百度,Yahoo都搜过了,有位仁兄说了句Debug找错就完了。

               对了,MyEclipse自动加入的spring1.2的包里 org.springframework.util.ClassUtils真的没有isPresent方法,可是我加了spring2.0的包,还是不行。

             我是束手无策了,使用的最简单的方法(网上,书上,Rod Johnson的两本,再加上各种国内的技术书都看遍了,都使用这种方法),就这么几个文件,真的不知道怎么办了,望~        

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值