Ошибка отката транзакции JPA Spring

Сделал валидацию поля email для модели пользователя. Когда валидация не проходит, обрабатываю исключение ConstraintViolationException, но дальше возникает исключение org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only. Одно из исправлений - @Transactional(propagation = Propagation.REQUIRES_NEW) - мне не помогло. Подозреваю, что это потому что я вызываю метод, в котором происходит работа с БД, через Method.invoke()

try {
  sendMessage = (SendMessage) messageSource.getMethod().invoke(messageHandler, update); //тут происходит исключение UnexpectedRollbackException
} catch (IllegalAccessException | InvocationTargetException e) {
   e.printStackTrace();  //я попадаю в этот блок
   return null;
//этот метод как раз и вызывается через invoke
@CheckMessage(state = State.SETTING_EMAIL) //моя анотация
    public SendMessage setEmail(Update update) {
        SendMessage sendMessage = new SendMessage();
        String email = update.getMessage().getText().trim();
        User user = userRepository.getBytgid(getChatId(update));
        user.setEmail(email);
        try {
            entityManager.flush();
            sendMessage.setText("Почта <b>" + email + "</b> установлена");
            sendMessage.setReplyMarkup(Keyboard.startKeyboard);
            stateManager.setStateUser(getChatId(update), State.START_STATE);
            stateManager.clearCacheUser(getChatId(update));
        } catch (ConstraintViolationException e) {
            log.warn("No valid email format"); //этот блок кода выполняется
            sendMessage.setText("Неверный формат электронной почты");
        }
        return sendMessage;
    }

Моя анотация

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Transactional(propagation = Propagation.REQUIRES_NEW)
public @interface CheckMessage {
    State state() default State.ALL_STATE;

    String text() default "";

    String button() default "";

    Class<?>[] dataType() default String.class;
}

На выходе invoke я ожидаю получить SendMessage с сообщением об ошибке, чтобы отправить это пользователю


Ответы (0 шт):