论坛首页 Java企业应用论坛

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

浏览 18204 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-10-13  
上一篇我的struts2配置,间接实现零配置
然后因为业务需求,需要对action实现事务,结果发现,通过通配符配置的action,因为是通过struts2
的自动装配,没有在struts2和spring2的配置文件中声明,经测试,在其他配置在spring中的bean中
是无法使用struts2的action的,会报nullpointer错误,所以我现在怀疑,在spring2中做的声明式
事务,可能对action也没有作用

   发表时间:2007-10-13  
引用
在其他配置在spring中的bean中
是无法使用struts2的action的
为什么bean要调action
0 请登录后投票
   发表时间:2007-10-13  
最好专门给action的事务配一个事务拦截器,楼主可以试试这个方法。
搜到一段代码:
/*
 * 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;
	}

}
0 请登录后投票
   发表时间:2007-10-13  
恩,跟我现在的思路一样,自己仿着Struts2的MethodFilterInterceptor写了一个,加入事务控制。
Struts2的MethodFilterInterceptor只能匹配确定的方法名,不能识别通配符,所以自己写了一个。
1 请登录后投票
   发表时间:2007-10-13  
另外,本来想测试清楚spring2的声明式事务到底对struts2的自动装配的action是否有效,结果按着spring2的文档,基于aop方式配置多个pointcut,始终提示错误,不知道算不算是spring2的bug
0 请登录后投票
   发表时间:2007-10-13  
使用spring可以将事务通过声明方式配置到action类的方法上,但是对于抛出的异常怎么处理,难道直接抛给客户?至少没有配置到service层上的那样灵活。
0 请登录后投票
   发表时间:2007-10-13  
在action中进行事务控制有意义吗?action不应该封装业务逻辑。
0 请登录后投票
   发表时间:2007-10-13  
action当然不应该封装业务逻辑,但是action是controller,比如在
一个action里面可能会由几个Business Service的方法组成一个流程,
如果仅对service的方法实现事务控制,那如果流程中某一个service
的方法出现了问题,流程中之前调用的其他service怎么回滚呢。
0 请登录后投票
   发表时间:2007-10-14  
Action抛出的异常会马上被专门的处理类捕获掉,声明式的事务应该无法正确的回滚。
0 请登录后投票
   发表时间:2007-10-15  
colin4k 写道
action当然不应该封装业务逻辑,但是action是controller,比如在
一个action里面可能会由几个Business Service的方法组成一个流程,
如果仅对service的方法实现事务控制,那如果流程中某一个service
的方法出现了问题,流程中之前调用的其他service怎么回滚呢。

这段流程是否可以移到一个单独的组件中,然后对该组件进行事务控制?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics