У меня происходит самая странная вещь, и я могу » Я понимаю, почему. Лучший способ описать это - предоставить упрощенный пример:
@Service
@Transactional
public class Foo{
public ModelAndView delete(@ModelAttribute("abc") Long id) {
ModelAndView mav = new ModelAndView();
try {
getDaoService().delete(id); //Calls Bar.delete()
} catch (final Exception e) {
// Add a custom error message to the mav for the user to see
mav.getModelMap().addAttribute(blah, blah);
}
return mav;
}
}
@Service
@Transactional
public class Bar {
public void delete(final E entity) throws HibernateException {
if (null != entity) {
try {
sessionFactory.getCurrentSession().delete(entity);
} finally {
sessionFactory.getCurrentSession().flush();
}
}
}
}
В этом конкретном случае я пытаюсь удалить объект, у которого есть нарушение ограничения (ORA-02292). Я ожидаю, что удаление не удастся из-за этого. Когда удаление не удается, я хочу показать пользователю соответствующее настраиваемое сообщение.
Вместо того, чтобы показать пользователю настраиваемое сообщение, вызов завершается ошибкой и отображает на экране следующее:
org.springframework.transaction.UnexpectedRollbackException: транзакция откатилась, потому что она была помечена только для отката
Когда я использую отладчик, я вижу, что ошибка правильно обнаружена и что объект ModelAndView имеет внутри себя настраиваемое сообщение. Итак, я понятия не имею, почему исключение все еще генерируется после того, как оно было поймано и обработано. Кто-нибудь знает, почему это происходит?