框架是Spring2.5, struts2, ibatis,采用声明式事务,BEAN自动扫描。
[code="xml"]
[/code]
DAO和SERVICE参考的是SpringSide2,SERVICE继承范型DAO:
[code="java"]
//Spring Service Bean的标识.
@Service
//默认将类中的所有函数纳入事务管理.
@Transactional
public class UserManager extends EntityDao {
}
[/code]
然后问题来了。 UserManager继承自DAO,我在Action里调用UserManager里面的DAO的方法做CRUD,没有问题。但只要我在UserManager里增加自定义方法,如:
[code="java"]
//Spring Service Bean的标识.
@Service
//默认将类中的所有函数纳入事务管理.
@Transactional
public class UserManager extends EntityDao {
public void fun() {
}
}
[/code]
仅仅加一个任意的空方法后,在请求调用了UserManager的Action的时候,就出了这样的LOG,而且没有异常。
2009-03-30 17:55:48 [DEBUG]- Entering nullPropertyValue [target=[com.opensymphony.xwork2.DefaultTextProvider@13e9853], property=struts]
2009-03-30 17:55:48 [DEBUG]- Entering nullPropertyValue [target=[com.opensymphony.xwork2.DefaultTextProvider@13e9853], property=struts]
2009-03-30 17:55:48 [DEBUG]- Creating an DefaultActionProxy for namespace /user and action name user
画面报了500错误
只要在SERVICE类里加入任意自定义方法,就会出这样的问题。太奇怪了。
[b]问题补充:[/b]
to iampurse,
SpringSide2里就是Serivce继承泛型DAO。我觉得这样的好处有两点:
1,把DAO方法当SERVICE方法用。因为很多场景里业务方法就是简单的CRUD,用DAO方法正合适,不用再到SERVICE里写一层方法了。
2,如果用注入,就要写很多个DAO类,用继承的话,就不用写DAO类了。减少了要维护的文件数量。
但这样做又有点耦合。
UserManager里加的方法就不能算成是DAO的方法了,应该当成是SERVICE的方法。
[b]问题补充:[/b]
呵呵.
把EntityDao配置成bean并加上 abstract看看
这句我有点不太明白.给个代码看一下吧.
我只是想说 你一个Service里头只对一个Entity做操作
然后如果要加一个Dao操作,直接夹在service里头 - -。。
好吧,不讨论设计上的问题。
想看具体的设计的话,可以看我回答的另一个问题。
http://www.iteye.com/problems/13072
我觉得是不是你的service继承了Dao的问题
把EntityDao配置成bean并加上 abstract看看
下班了 ,晚上回去给你看。
看出一个设计上的问题,
service怎么能继承泛型Dao捏?
注入引用还差不多。
而且,你要加Dao方法的话,也不是加在service里头,
是加在你特定的Entity的Dao里头。
这个EntityDao也要被定义在spring里头的。