问题描述:
用户实现类 UserServiceImpl方法添加注解
 @Transactional(rollbackFor = {Exception.class, Error.class})
 事务失效问题,代码如下:
class UserServiceImpl implements UserService
/**
 * 文件上传类型
 **/
private static String uploadType;
 @Override
 @Transactional(rollbackFor = {Exception.class, Error.class})
public void insert(User user,MultipartFile file){
	userMapper.insert(user);
	roleMapper.insert(role);
	checkFile(file);
	uploadFile(file)
}
private void checkFile(MultipartFile file) {
        //判断文件大小
        if (file!=null && && !file.isEmpty()) {
            throw new ParameterException("头像不能为空");
        }
}
/**
 * 判断配置文件中是否配置
 **/
@Autowired
private UserServiceImpl(@Value("${file.upload.type}") String uploadType) {
	if (StringUtils.isEmpty(uploadType)) {
      logger.error("配置文件中不存在头像上传方式,请联系管理员!");
   }
       UserServiceImpl.uploadType = uploadType;
}
 
当文件为空时,用户仍能插入到数据库当中,事务失效。
原因分析
参考相关文章发现,userServiceImpl为非代理类时,导致事务失效。那么什么原因导致userServiceImpl边为非代理类呢?是构造方法验证配置文件信息是否存在引起的。所以便有了以下解决方案。
优化方案
userServiceImpl 实现InitializingBean 接口 重写afterPropertiesSet()方法进行验证。 这样事务失效的问题就解决了
class UserServiceImpl implements UserService, InitializingBean
@Value("${file.upload.type}
private String uploadType;
@Override
@Transactional(rollbackFor = {Exception.class, Error.class})
public void insert(User user,MultipartFile file){
	userMapper.insert(user);
	roleMapper.insert(role);
	checkFile(file);
	uploadFile(file)
}
private void checkFile(MultipartFile file) {
        //判断文件大小
        if (file!=null && && !file.isEmpty()) {
            throw new ParameterException("头像不能为空");
        }
}
/**
 * 判断配置文件中是否配置
 **/
@Override
public void afterPropertiesSet() throws Exception {
	if (StringUtils.isEmpty(uploadType)) {
      logger.error("配置文件中不存在头像上传方式,请联系管理员!");
   }
}










