Spring+hibernate中加上AOP的事物管理怎么始终出现这样的问题?????
我的代码如下:
base.java
java代码:
public class base extends Action {
private testservice test;
public void setServlet(ActionServlet actionServlet) {");(---------这里的问题)
super.setServlet(actionServlet);
ServletContext servletContext = actionServlet.getServletContext();
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
this.test = (testservice) wac.getBean("tdao");
}
protected testservice getTest() {
return test;
}
}
baseAction继承base,baseAction.java
java代码:
Prison p=new Prison();
p.setUsername("123");
p.setCausation("1111");
getTest().save(p);
System.out.print("success!!!!!!!!!!!!!!!!1");
return actionMapping.findForward("success");
Spring-hibernate.xml
java代码:
<bean id="ttDAO" class="org.spring.service.testservice" singleton="true">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="tdao" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager" />
</property>
<property name="target">
<ref local="ttDAO" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
一直出现了这个问题:
java代码:
StandardWrapperValve[action]: Servlet.service() for servlet action threw exception
java.lang.ClassCastException
java.lang.ClassCastException
at org.struts.action.base.setServlet(base.java:15)
如果我把上面的spring-hibernate.xml的代码改成下面的:
java代码:
<bean id="tdao" class="org.spring.service.testservice">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
程序运行正常,
请问到底是什么原因呢????
问题点数:50、回复次数:20Top
1 楼hj12(12)回复于 2004-12-02 12:38:00 得分 10
dao类要实现接口
Top
2 楼javafansy(java fans)回复于 2004-12-02 12:51:35 得分 0
这不是实现了吗?
bean id="ttDAO" class="org.spring.service.testservice" singleton="true">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>Top
3 楼sgdb(神天月晓)回复于 2004-12-02 14:25:48 得分 0
倒还在问这个问题
楼主把你的tdao和ttdao的代码贴出来看看Top
4 楼javafansy(java fans)回复于 2004-12-02 15:11:31 得分 0
代码如下:
teacherDAO.java:
import com.bean.teacher;
public interface teacherDAO {
public abstract void saveTeacher(teacher teacher);
}
teacherDAOhibernate.java代码:
import org.springframework.orm.hibernate.support.HibernateDaoSupport;
import com.dao.teacherDAO;
import java.util.List;
import com.bean.teacher;
public class teacherDAOhibernate extends HibernateDaoSupport implements teacherDAO{
public teacherDAOhibernate() {
super();
}
public void saveTeacher(teacher teacher) {
getHibernateTemplate().save(teacher);
}
}
请帮忙看看;到底是什么问题???Top
5 楼sgdb(神天月晓)回复于 2004-12-02 15:45:37 得分 0
倒,我最想看的是org.spring.service.testserviceTop
6 楼wjmmml(笑着悲伤)回复于 2004-12-02 16:10:29 得分 0
呵呵testservice
必须有接口Top
7 楼beyond_xiruo(CorruptionException)回复于 2004-12-02 16:14:59 得分 0
aopalliance.jar扩展包有不?
Top
8 楼javafansy(java fans)回复于 2004-12-02 16:23:03 得分 0
我写错了;org.spring.service.testservice应该是:org.spring.service.teacherDAOhibernate
我改过来了;还是出现一样的问题
import org.springframework.orm.hibernate.support.HibernateDaoSupport;
import com.dao.teacherDAO;
import java.util.List;
import com.bean.teacher;
public class teacherDAOhibernate extends HibernateDaoSupport implements teacherDAO{
public teacherDAOhibernate() {
super();
}
public void saveTeacher(teacher teacher) {
getHibernateTemplate().save(teacher);
}
}
Top
9 楼javafansy(java fans)回复于 2004-12-02 16:29:13 得分 0
搞错了;
org.spring.service.testservice如下:
package org.spring.service;
import org.springframework.orm.hibernate.support.HibernateDaoSupport;
import org.spring.dao.testdao;
import org.hibernate.bean.Prison;
public class testservice extends HibernateDaoSupport implements testdao{
public testservice() {
}
public void save(Prison p) {
getHibernateTemplate().save(p);
}
}
Top
10 楼sgdb(神天月晓)回复于 2004-12-02 16:29:40 得分 0
teacherDAO.java:
import com.bean.teacher;
public interface teacherDAO {
public void saveTeacher(teacher teacher);
}
倒,你在接口里写抽象方法;Top
11 楼sgdb(神天月晓)回复于 2004-12-02 16:31:34 得分 0
看看你的testdao里是不是也有
public abstract void saveTeacher(teacher teacher);这样的写法
把abstract去掉Top
12 楼javafansy(java fans)回复于 2004-12-02 16:34:53 得分 0
我的
testdao.java:
package org.spring.dao;
import org.hibernate.bean.Prison;
public interface testdao {
void save(Prison prison);
}
testservice.java:
import org.springframework.orm.hibernate.support.HibernateDaoSupport;
import org.spring.dao.testdao;
import org.hibernate.bean.Prison;
public class testservice extends HibernateDaoSupport implements testdao{
public testservice() {
}
public void save(Prison p) {
getHibernateTemplate().save(p);
}
}
没有写抽象对象;Top
13 楼sgdb(神天月晓)回复于 2004-12-02 16:41:16 得分 10
this.test = (testservice) wac.getBean("tdao");
->
this.test = (testservice) wac.getBean("ttDAO");Top
14 楼javafansy(java fans)回复于 2004-12-02 16:46:44 得分 0
我也知道:
this.test = (testservice) wac.getBean("tdao");
->
this.test = (testservice) wac.getBean("ttDAO");
这样行的呀;
我想用AOP拦截器来进行事物管理呀;通过
<property name="target"><ref local="ttDAO" /></property>
然后 this.test = (testservice) wac.getBean("tdao");
来获得;
Top
15 楼sgdb(神天月晓)回复于 2004-12-02 16:54:06 得分 0
倒,你对spring的理解有问题
<bean id="tdao" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager" />
</property>
<property name="target">
<ref local="ttDAO" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
这段就是让spring来管理事务,你自己不需要做任何事情
spring 自行管理事务默认用的就是aop吧
Top
16 楼javafansy(java fans)回复于 2004-12-02 17:22:11 得分 0
让spring的AOP来管理事务,通过它来管理具体的bean
<property name="target"><ref local="ttDAO" /></property>
如果照你说的的那样,他怎么来管理具体的 bean呢,而ttDAO是通过:
<bean id="ttDAO" class="org.spring.service.testservice" singleton="true">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
来得到的;然后给TransactionProxyFactoryBean来进行事物管理,
从而获得:this.test = (testservice) wac.getBean("tdao");
也许是我的理解有不对吧,还请高手指教!!!!!!!!!!!!1Top
17 楼sgdb(神天月晓)回复于 2004-12-02 17:31:46 得分 0
<property name="target">
<ref local="ttDAO" />
</property>
看看这里,就是把ttDAO交给tdao去管理
再看看整个tdao的定义是不是和spring的ADVISOR很像,呵呵,其实就是一个ADVISOR;Top
18 楼sgdb(神天月晓)回复于 2004-12-02 17:33:29 得分 10
要是想深入的了解,先看看spring官方网站的文档,然后再看看spring的源代码Top
19 楼javafansy(java fans)回复于 2004-12-03 08:49:42 得分 0
那请问我应该怎么来做才能成功呢????Top
20 楼niyboy(I Love J2EE)回复于 2004-12-03 16:58:44 得分 20
我曾经也遇到过这样的问题,如果直接通过绝对路径来获得applicationcontext.xml;你上面的代码就不会出现问题的;
如果象你这样来做的话,我也没有成功!!!
到底有没有人知道呢????Top




