在服务层中发生任何回滚后,请求正在关闭。它不会从控制器继续。
前任:
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
}
}
在上面的代码中,如果任何一个用户创建失败,则仅对该用户进行回滚,之后剩余的用户对象将不进行处理。
要求是:保留失败的用户对象,并需要处理其余未处理的用户对象。
3条答案
按热度按时间r7s23pms1#
像这样更新您的代码以处理所有用户,并将错误添加到错误列表。
hgc7kmma2#
如果服务是事务性的,并且在循环中调用它,则必须在循环中捕获异常。这是处理多个项目的请求的一般问题。是否应拒绝所有项目或收集失败的项目。。。。
sg24os4d3#
您的示例代码似乎没有您描述的问题,因为:
您已经捕获了异常并在createuser方法中处理了它,并且异常不会传播到控制器。控制器将继续处理下一个。
事务性在服务方法中被注解,这是正确的。每当服务方法返回到控制器并且事务结束时,在处理下一个用户时将创建一个新的服务方法。
您描述的问题似乎是您没有处理服务内部的异常。
另一种可能性是catch子句或return语句中存在另一个异常。