我在用注解事务的时候出现下面的异常
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [beans.xml]: BeanPostProcessor before instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:452)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at questionTest.QuestionTest.main(QuestionTest.java:18)关建代码如下:
beans里面的
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 
  
  <!-- 配置数据源 -->
   <bean id="dataSource"
     class="org.springframework.jdbc.datasource.DriverManagerDataSource">
     <!-- 驱动类 -->
     <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
     <!-- driverUrl连接串 -->
     <property name="url" value="jdbc:sqlserver://localhost:1433; DatabaseName=yd_Test"/>
     <!-- 用户名 -->
     <property name="username" value="sa"/>
     <!-- 密码 -->
     <property name="password" value="123456"/>
</bean>
   <bean name="QuestionDAO" class="com.zy.DAO.QuestionDAO">
       <property name="dataSource" ref="dataSource"/>
       <property name="transactionManager" ref="transactionManager"/>
   </bean>
   <!-- 注解事务 -->
 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
    <property name="dataSource" ref="dataSource"></property>  
</bean>  
  <tx:annotation-driven transaction-manager="transactionManager" />
<bean name="QuestionItemDAO" class="com.zy.DAO.QuestionItemDAO">
   <property name="dataSource" ref="dataSource"/>
</bean>
<bean name="QuestionTypeDAO" class="com.zy.DAO.QuestionTypeDAO">
    <property name="dataSource" ref="dataSource"/>
</bean>
<bean name="CategoryDAO" class="com.zy.DAO.CategoryDAO">
    <property name="dataSource" ref="dataSource"/>
</bean>
<bean name="ExamPaperDAO" class="com.zy.DAO.ExamPaperDAO">
    <property name="dataSource" ref="dataSource"/>
    <property name="transactionManager" ref="transactionManager"/>
</bean></beans>DAO里面的@Transactional
public int AddQuestion(Question q) {
    String sql="insert into question (title,answers,question_type_id,category_id,build_date,builder_id,re) " +
     "values(:title, :answers, :question_type_id, :category_id, :build_date, :builder_id, :re)";
  Map<String, Object> questionMap=new HashMap<String, Object>();
  questionMap.put("title", q.getTitle());
  questionMap.put("answers", q.getAnswers());
  questionMap.put("question_type_id", q.getQuestion_type_id());
  questionMap.put("category_id", q.getCategory_id());
  questionMap.put("build_date", q.getBuildDate());
  questionMap.put("builder_id", q.getBuilder_id());
  questionMap.put("re", q.getRe());
    
    //返回数据
    int rows=0;
             //添加question
    rows=getSimpleJdbcTemplate().update(sql, questionMap);

    //获取question最近插入的id的
  String sql_id="select MAX(id) as id from question";
  @SuppressWarnings("deprecation")
 Question question_id=(Question)  getSimpleJdbcTemplate().queryForObject(sql_id,ParameterizedBeanPropertyRowMapper.newInstance(Question.class));
  //添加item
  QuestionItem item=new QuestionItem();
  for (int i = 0; i < q.getItemsList().size(); i++) {
//获取questionItem 
  item=q.getItemsList().get(i);
    //添加items
String sql_item="insert into question_item (question_id,item) values(:question_id, :item)";
    Map<String, Object> itemMap=new HashMap<String, Object>();
    itemMap.put("question_id",question_id.getId());
    itemMap.put("item", item.getItem());
    
    getSimpleJdbcTemplate().update(sql_item, itemMap);
    }   return rows;
}
测试代码:
public static void main(String[] args){
ApplicationContext context= new ClassPathXmlApplicationContext("beans.xml");
        QuestionDAO qDaoInf=(QuestionDAO)context.getBean("QuestionDAO");
            
       //添加选择项
        QuestionItem item1=new QuestionItem();
        item1.setItem("注解式事物管理1");
        QuestionItem item2=new QuestionItem();
        item2.setItem("注解式事物管理2");
        QuestionItem item3=new QuestionItem();
        item3.setItem("注解式事物管理3");
        QuestionItem item4=new QuestionItem();
        item4.setItem("注解式事物管理4");
        //添加试题
        List<QuestionItem> lisItems=new ArrayList<QuestionItem>();
        lisItems.add(item1);
        lisItems.add(item2);
        lisItems.add(item3);
        lisItems.add(item4);
        Date now=new Date();
        Question question=new Question("注解式事物管理的测试!",lisItems,"注解式事物管理1",1,1,now,2,"注解事物测试");
       
        int rows=qDaoInf.AddQuestion(question);
       System.out.println(rows);
        
}
我把beans.xmlp里面的
<tx:annotation-driven transaction-manager="transactionManager" />
这句话去掉在DAO里面加了一个方法反回一句话测试
public String query()
{
return "你好";
}
没有异常发生。但是一加上去就会出现上面的异常我在网上找了好久都没找到解决办法。希望各位高手指点

解决方案 »

  1.   

     <tx:annotation-driven transaction-manager="txManager"/> 
     <bean id="txManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />  
    </bean>

    必须给注入事务管理器的实例。这样就不报错了
      

  2.   

    我的bean里边写的有,就是这段
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">   
      <property name="dataSource" ref="dataSource"></property>   
    </bean>   
      <tx:annotation-driven transaction-manager="transactionManager" />
      

  3.   

    nested exception is java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice
    少activation.jar包
      

  4.   

    错了,是少事这个aopalliance.jar
      

  5.   

    楼上的我按照你说的把aopalliance.jar包添加进去了不过又出现这个异常Exception in thread "main" java.lang.ClassCastException: $Proxy5 cannot be cast to com.zy.DAO.QuestionDAO
    at questionTest.QuestionTest.main(QuestionTest.java:19)但是我把<tx:annotation-driven transaction-manager="transactionManager"/>这句话删掉就正常了,怎么回事啊,谢谢了 
      

  6.   

    强转出错。
    你应该把DAO写成一个接口,然后用写一个实现类
    <bean name="QuestionDAO" class="com.zy.DAO.QuestionDAOImpl">
    然后这么写:
    QuestionDAO qDaoInf=(QuestionDAO)context.getBean("QuestionDAO");
    应该就不会出错
      

  7.   

    spring3.0的版本是需要导aopalliance.jar的
    spring2.X就不需要
      

  8.   

    你说的那个包我以经加上了,你说的改成这个样子<bean name="QuestionDAO" class="com.zy.DAO.QuestionDAOImpl">就不对,因为我就没有QuestionDAOImpl这个javaBin。还有我一定会给你们分的,我应该是在这上第一次提问吧,所以就没有结帖率。还希望大家多多帮助啊。还有一点就是我不把<tx:annotation-driven transaction-manager="transactionManager"/>这句话去掉,把方法上的@Transactional这个去掉也不会报错。
      

  9.   

    我印输出了  System.out.println(context.getBean("QuestionDAO"));结果是com.zy.DAO.QuestionDAO@5bee66这样应该是可转换的啊,为什么就是报错呢
      

  10.   

    跟你说了,你要写一个QuestionDaoImpl实现类撒,把QuestionDao写成接口,里面只定义方法,在QuestionDaoImpl里面实现方法。还有你把那把@Transactional去掉或者配置文件里面的事务管理去掉,当然不会报错啊,因为那样就没有用到事务管理了。不用事务管理就不需要把DAO写成接口形式。
      

  11.   

    解决办法也不只一个,给你看个链接吧:
    http://zhidao.baidu.com/question/92175778.html
      

  12.   

    spring的文档中这么写的:Spring AOP部分使用JDK动态代理或者CGLIB来为目标对象创建代理,如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理。所有该目标类型实现的接口都将被代理。若该目标对象没有实现任何接口,则创建一个CGLIB代理。
      

  13.   

    跟你好难沟通啊
    我说的是在接口里面定义方法,在实现类里面实现方法
    我的例子是:QuestionDao为接口,QuestionDAOImpl为实现类!
      

  14.   

    几个关键点:
     <bean name="QuestionDAO" class="com.zy.DAO.QuestionDAOImpl">QuestionDAOImpl 是你写的实现类QuestionDAO qDaoInf=(QuestionDAO)context.getBean("QuestionDAO");这个不用改,QuestionDAO是你写的接口