Весной, Как продолжить запрос от контроллера для цикла после отката транзакции, произошедшего за одну итерацию - PullRequest
0 голосов
/ 01 сентября 2018

Запрос закрывается после любого отката, произошедшего на уровне сервиса. Он не продолжается с контроллера.

например:

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; 
  }
 }
}

// UserServiceImpl

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 ]

0 голосов
/ 01 сентября 2018

Кажется, что в вашем примере кода нет проблемы, которую вы описали, потому что:

  1. Вы перехватили исключение и обработали его в методе createUser, и это исключение не будет передано в контроллер. Контроллер продолжит обработку следующего.
  2. Транзакционный аннотирован в методе Service, что является правильным. Всякий раз, когда метод обслуживания возвращается контроллеру, и транзакция заканчивается, и при обработке следующего пользователя будет создан новый.

Кажется, описанная вами проблема связана с тем, что вы не обработали исключение внутри службы.

Другая возможность состоит в том, что у вас есть другое исключение внутри предложения catch или оператора return.

0 голосов
/ 01 сентября 2018

Обновите ваш код так, чтобы обрабатывать всех пользователей, добавлять ошибки в errorList.

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;
 }
0 голосов
/ 01 сентября 2018

Если ваш сервис транзакционный и вы вызываете его в цикле, вы должны перехватить исключение внутри цикла. Это общая проблема с запросом, который обработал более одного элемента. Если все предметы будут отклонены, или вы заберете предметы, которые потерпели неудачу ...

...