有没有人在struts2的action这一层做事务控制?

[复制链接]
查看11 | 回复4 | 2007-10-20 08:38:44 | 显示全部楼层 |阅读模式
上一篇我的struts2配置,间接实现零配置
然后因为业务需求,需要对action实现事务,结果发现,通过通配符配置的action,因为是通过struts2
的自动装配,没有在struts2和spring2的配置文件中声明,经测试,在其他配置在spring中的bean中
是无法使用struts2的action的,会报nullpointer错误,所以我现在怀疑,在spring2中做的声明式
事务,可能对action也没有作用
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
最好专门给action的事务配一个事务拦截器,楼主可以试试这个方法。
搜到一段代码:
Java代码
/*
* Created on 2006-5-20
*
*/
package com.wolfsquare.core.webwork.interceptor;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import com.opensymphony.xwork.ActionInvocation;
import com.opensymphony.xwork.interceptor.Interceptor;
import com.wolfsquare.core.Application;
/**
* 控制Action级的事务
*
* @author wolfsquare
*
*/
public class ActionTransactionInterceptor implements Interceptor {
private DefaultTransactionDefinition def = new DefaultTransactionDefinition();
private PlatformTransactionManager transactionManager = null;
public void destroy() {
}
public void init() {
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
// TODO 获取当前事务管理器,似乎Spring框架有更好的方式.
transactionManager = (PlatformTransactionManager) Application

.getInstance().getContainer()

.getComponent("transactionManager");
}
public String intercept(ActionInvocation ai) throws Exception {
String ret = null;
TransactionStatus status = transactionManager.getTransaction(def);
try {

ret = ai.invoke();

transactionManager.commit(status);
} catch (Exception e) {

transactionManager.rollback(status);

throw e;
}
return ret;
}
}
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
呵呵
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
spring 的声明式事务 不能拦截ACTION层的 ActionForward 方法,因为ActionForward方法是ACTION容器的映射方法,真正执行的是ACTION父类的 excute 方法。这也可能是SPRING和STRUTS不能完美结合的一个缺陷。
问题:
1、拦截ACTION层,不能保证事务完整性(不排除ActionForward 也会需要事务)
2、拦截父类ACTION会付出沉重代价,如果你拦截所有ACTION方法以及父类的excute 方法,这样任何跳转都有事务,有事务就会获得数据库连接,可想而知!
3、因为ACTION作为后才代码的第一层,无法实现分步事务,还得配合使用新事物标签(嵌套事务),加大系统复杂程度。
4、如果事务加在ACTION上并没有拦截excute 方法,只有吧ActionForward 需要处理事务的代码抽取到非ACTION中才有事务。
结论:不要在ACTION层上控制事务,会出现N多问题,解决起来就像拆东墙补西墙。
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
这几个好眼熟
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行