spring事务@Transactional注解使动态代理失效问题

问题描述:我有一个service,使用了@Transactional注解来开启事务,见《spring+mybatis注解配置事务失效问题》所述,原本我使用代理反射调用这个service里的2个方法(非接口方法,其他接口方法好使)在没有使用事务注解以前是好使的,在添加了事务后不好使

service类部分代码如下:

/**
 * <p>
 * 数据操作实现类
 * </p>
 */
@Transactional
@Service("payBookService")
public class PayBookService  extends CommonService implements ICommonService,IPayBookService {
	
	private static Logger logger = Logger.getLogger(PayBookService.class);
	
	@Resource(name = "payBookMapper")
	private PayBookMapper payBookMapper;
	
	@Override
	public List<Map<String, Object>> selectFSData(Map<String, Object> map) {

调用service的代码如下:

 

private List<Map<String,Object>> getSendMessage(String clazzName,String methodName,List<Map<String, Object>> data) throws Exception {
		List<Map<String,Object>> dataList;
		try {
			obj=(ICommonService)DBUtil.getBeanByName(clazzName);
		} catch (Exception e) {
			throw new Exception("配置表中没有找到对应配置类"+e.getCause().getMessage());
		}
		Method mth;
		try {
			mth = obj.getClass().getMethod(methodName,new Class[] {Map.class});
			dataList = (List<Map<String,Object>>)mth.invoke(obj,(List<Map<String,Object>>)data);
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("配置表中没有找到对应配置方法"+e.getCause().getMessage());
		}
		return dataList;
	}

原因是事务注解能使基于类的动态代理失效,只能使用基于接口的代理,于是我添加了一个接口IPayBookService把不能调用的2个方法添加进去,并且service实现它即可

import java.util.List;
import java.util.Map;

public interface IPayBookService {
    /**
     * 确认缴款书
     * @param fsdatalist
     * @return
     */
    public Map<String, Object> updateFSDataConfirm(List<Map<String, Object>> fsdatalist);
    
    /**
     * 查询缴款书
     * @param fsdatalist
     * @return
     */
    public Map<String, Object> selectVilidateQuery(List<Map<String, Object>> fsdatalist);
    
}

本人只是知道spring的这些现象,如果哪位朋友知道其中的原理,望不吝赐教 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值