@Transactional(rollbackFor = Exception.class) @Override public MessageData updateUser(User user) throws Exception { if (user == null || user.getId() == null || user.getId() < 1) { throw new ServiceException(WholeConstants.CommonStatus.MISSING_PARAMETERS); } if (StringUtils.isBlank(user.getName()) || !user.getName().matches(PathConstant.STRING_TEN)) { throw new ServiceException(WholeConstants.CommonStatus.NAME_FORMAT_ERROR); } if (StringUtils.isBlank(user.getUsername()) || !user.getUsername().matches(PathConstant.STRING_TEN)) { throw new ServiceException(WholeConstants.CommonStatus.ACCOUNT_NAME_FORMAT_ERROR); } Integer[] params = {1,2};//userType if (user.getUserType() == null || !ObjectUtils.containsElement(params,user.getUserType())) { throw new ServiceException(WholeConstants.CommonStatus.ERROR_STATUS_PARAMS); } if (StringUtils.isAnyBlank(user.getPassword(),user.getCheckPass())) { if (StringUtils.isAllBlank(user.getPassword(),user.getCheckPass())) { user.setPassword(null);//两次密码都为空则不修改 }else { throw new ServiceException(WholeConstants.CommonStatus.PASSWORD_FORMAT_ERROR); } } if (!user.getPassword().matches(PathConstant.STRING_TWENTYS) || !user.getCheckPass().matches(PathConstant.STRING_TWENTYS)) { throw new ServiceException(WholeConstants.CommonStatus.PASSWORD_FORMAT_ERROR); }else if (!user.getPassword().equals(user.getCheckPass())){ throw new ServiceException(WholeConstants.CommonStatus.ACCOUNT_DIFF_PASSWORD); }else { user.setPassword(Md5Util.getStrMd5(user.getPassword())); } //判断用户名称是否重复 if(webUserMapper.selectByUserName(user.getUsername(),user.getId()) > 0) { throw new ServiceException(WholeConstants.CommonStatus.ACCOUNT_NAME_EXIST); } user.setUpdateTime(new Date()); user.setUpdateUserId(ShiroUtil.getUserId()); //web平台修改用户角色 if(user.getUserType().equals(PathConstant.USER_TYPE_WEB)) { if(user.getRoleId() == null) { throw new ServiceException(WholeConstants.CommonStatus.ACCOUNT_ROLE_NULL); } if (userRoleMapper.updateByUserId(user.getId(), user.getRoleId()) < 1) { throw new ServiceException(WholeConstants.CommonStatus.ERROR_UPDATE); } } else if(user.getUserType().equals(PathConstant.USER_TYPE_APP)){ userRoleMapper.deleteByUserId(user.getId()); } if (webUserMapper.updateUser(user) != 1) { throw new ServiceException(WholeConstants.CommonStatus.ERROR_UPDATE); } logService.recordLog(LogType.UPDATE_TYPE.getCode(), "修改用户信息"); return MessageData.buildSuccess(); }翻译代码
时间: 2024-04-07 22:27:43 浏览: 115
这是一段Java代码,主要是一个名为updateUser的函数,其作用是更新用户信息。函数使用了@Transactional(rollbackFor = Exception.class)注解,表示在执行函数时会开启一个事务,如果出现异常则会回滚。函数接收一个User对象作为参数,并返回一个MessageData对象。
函数中进行了一系列的参数校验,包括用户ID、用户名称、账号名称、用户类型、密码等。如果检测到参数有误,则会抛出ServiceException异常。如果校验通过,则会更新用户的更新时间、更新者ID等信息,并将更新后的用户信息存储到数据库中。
在更新用户信息时,如果用户类型为web平台用户,则还会进行用户角色的修改操作。
最后,函数会记录日志并返回一个执行成功的MessageData对象。
相关问题
@Transactional 回滚批量插入
在使用 @Transactional 注解做事务管理时,如果在一个事务中执行了批量插入操作,可以通过设置事务的回滚策略来实现回滚。在 Spring 中,可以使用 `TransactionTemplate` 或者 `PlatformTransactionManager` 来进行事务管理和回滚操作。
具体实现可以参考以下步骤:
1. 在 Spring 中配置事务管理器,例如使用 `DataSourceTransactionManager`。
2. 在代码中使用 `@Transactional` 注解标注需要进行事务管理的方法。
3. 在方法中进行批量插入操作,如果出现异常,事务管理器会自动回滚事务。
例如:
```java
@Service
public class UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Transactional(rollbackFor = Exception.class)
public void batchInsert(List<User> userList) throws Exception {
String sql = "INSERT INTO user (name, age) VALUES (?, ?)";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
User user = userList.get(i);
ps.setString(1, user.getName());
ps.setInt(2, user.getAge());
}
@Override
public int getBatchSize() {
return userList.size();
}
});
}
}
```
在上面的例子中,我们使用 `@Transactional` 注解标注了 `batchInsert` 方法,并设置了回滚策略为所有异常都回滚。如果在执行批量插入操作时出现异常,事务管理器会自动回滚事务。
需要在Transactional注解指定rollbackFor或者在方法中使用rollback (line: 133)
是的,当使用`@Transactional`注解声明事务时,通常需要指定`rollbackFor`属性或在方法中使用`rollback`语句来指定在出现异常时需要回滚的异常类型。以下是一个示例:
```java
@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public void createUser(User user) throws Exception {
try {
userRepository.save(user);
} catch (Exception e) {
throw new Exception("Failed to create user");
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateUser(User user) throws Exception {
try {
userRepository.save(user);
} catch (Exception e) {
throw new Exception("Failed to update user");
}
}
}
```
在上面的示例中,`@Transactional`注解用于声明两个方法都需要使用事务,并且在出现任何异常时都需要回滚事务。`createUser`方法中,当保存用户时出现异常时,我们会手动抛出一个新的异常,这时事务将自动回滚。而在`updateUser`方法中,我们在方法级别上再次使用了`@Transactional`注解,并在其中指定了需要回滚的异常类型。这样,当更新用户时出现指定的异常类型时,事务将回滚。
阅读全文