Ошибка отката транзакции 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 с сообщением об ошибке, чтобы отправить это пользователю