我在用注解事务的时候出现下面的异常
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 "你好";
}
没有异常发生。但是一加上去就会出现上面的异常我在网上找了好久都没找到解决办法。希望各位高手指点
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 "你好";
}
没有异常发生。但是一加上去就会出现上面的异常我在网上找了好久都没找到解决办法。希望各位高手指点
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
必须给注入事务管理器的实例。这样就不报错了
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
少activation.jar包
at questionTest.QuestionTest.main(QuestionTest.java:19)但是我把<tx:annotation-driven transaction-manager="transactionManager"/>这句话删掉就正常了,怎么回事啊,谢谢了
你应该把DAO写成一个接口,然后用写一个实现类
<bean name="QuestionDAO" class="com.zy.DAO.QuestionDAOImpl">
然后这么写:
QuestionDAO qDaoInf=(QuestionDAO)context.getBean("QuestionDAO");
应该就不会出错
spring2.X就不需要
http://zhidao.baidu.com/question/92175778.html
我说的是在接口里面定义方法,在实现类里面实现方法
我的例子是:QuestionDao为接口,QuestionDAOImpl为实现类!
<bean name="QuestionDAO" class="com.zy.DAO.QuestionDAOImpl">QuestionDAOImpl 是你写的实现类QuestionDAO qDaoInf=(QuestionDAO)context.getBean("QuestionDAO");这个不用改,QuestionDAO是你写的接口