Me está pasando algo extraño y no puedo entender por qué. La mejor manera de describir esto es proporcionar un simple ejemplo:La excepción se propaga después de que ya está atrapado
@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();
}
}
}
}
En este caso particular, estoy tratando de eliminar un objeto que tiene una violación de restricción (ORA-02292). Espero que la eliminación falle debido a esto. Cuando la eliminación falla, deseo mostrarle al usuario un mensaje personalizado apropiado.
En lugar de ser capaz de mostrar al usuario un mensaje personalizado, la llamada falla y muestra el siguiente en la pantalla:
org.springframework.transaction.UnexpectedRollbackException: Transacción deshace porque se ha marcado como rollback-only
Cuando uso un depurador, puedo ver que el error está apropiadamente atrapado y que el objeto ModelAndView tiene el mensaje personalizado dentro de él. Por lo tanto, no tengo idea de por qué todavía se lanza una excepción después de haber sido atrapada y tratada. ¿Alguien tiene una idea de por qué está sucediendo esto?
impresionante, funcionó como un encanto! ¡¡¡Gracias!!! – user973479