问题描述:
用户实现类 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("配置文件中不存在头像上传方式,请联系管理员!");
}
}