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

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

service类部分代码如下:

/**
 * 

* 数据操作实现类 *

*/ @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> selectFSData(Map map) {

调用service的代码如下:

 

private List> getSendMessage(String clazzName,String methodName,List> data) throws Exception {
		List> 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>)mth.invoke(obj,(List>)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 updateFSDataConfirm(List> fsdatalist);
    
    /**
     * 查询缴款书
     * @param fsdatalist
     * @return
     */
    public Map selectVilidateQuery(List> fsdatalist);
    
}

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

 

你可能感兴趣的:(java)