mysql—在spring中,如何在事务回滚发生一次迭代后继续从controller for loop发出请求

wz8daaqr  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(346)

在服务层中发生任何回滚后,请求正在关闭。它不会从控制器继续。
前任:

public Class UserController {
 @Autowired
 UserService userService;
 createUserList(List < User > list) {
  try {
  RespObj obj=new RespObj();
   List < Obj > errorList = new ArrayList();
   for (User user: list) {
    Object obj = userService.createUser(user);
    errorList.add(obj);
   }
   //return success response along with any errorlist
   obj.setStatus(200);
   obj.setObj(errorList);
   return obj;
  } catch (Exception e) {
   //returning error response 
   obj.setStatus(400);
   obj.setObj(e.getMessage());
   return obj; 
  }
 }
}

//用户服务实现

public class UserServiceImpl implements UserService {
 @Transactional
 Object createUser(user) {
  try {
   dao.saveUser(user);
  } catch (Exception e) {
   //create error pojo 
  }
  // return error pojo if any
 }
}

在上面的代码中,如果任何一个用户创建失败,则仅对该用户进行回滚,之后剩余的用户对象将不进行处理。
要求是:保留失败的用户对象,并需要处理其余未处理的用户对象。

r7s23pms

r7s23pms1#

像这样更新您的代码以处理所有用户,并将错误添加到错误列表。

RespObj obj=new RespObj();
List < Obj > errorList = new ArrayList();
for (User user: list) {
 User user = new Object;
 try {
     user = userService.createUser(user);
   } catch (Exception e) {
      obj.setMessage(e.getMessage());
      obj.setStatus(400);
      errorList.add(obj);
     }
   }
   obj.setStatus(200);
   obj.setErrorList(errorList);
   return obj;
 }
hgc7kmma

hgc7kmma2#

如果服务是事务性的,并且在循环中调用它,则必须在循环中捕获异常。这是处理多个项目的请求的一般问题。是否应拒绝所有项目或收集失败的项目。。。。

sg24os4d

sg24os4d3#

您的示例代码似乎没有您描述的问题,因为:
您已经捕获了异常并在createuser方法中处理了它,并且异常不会传播到控制器。控制器将继续处理下一个。
事务性在服务方法中被注解,这是正确的。每当服务方法返回到控制器并且事务结束时,在处理下一个用户时将创建一个新的服务方法。
您描述的问题似乎是您没有处理服务内部的异常。
另一种可能性是catch子句或return语句中存在另一个异常。

相关问题