问题描述:我有一个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的这些现象,如果哪位朋友知道其中的原理,望不吝赐教