У меня есть контроллер Spring MVC, и когда возникает исключение, я хотел бы показать сообщение об исключении в представлении и откатить открытые транзакции.Представление содержит такую форму:
<form:form method="POST" modelAttribute="registrationForm">
<form:errors path="*" cssClass="error-message"/>
...
</form:form>
Я хотел бы показать сообщение об исключении в представлении, используя функцию <form:errors ... />
.Это мое настоящее довольно ужасное решение:
@RequestMapping(value = "/registration", method = RequestMethod.POST)
public ModelAndView submitForm(@ModelAttribute("registrationForm") RegistrationForm registrationForm,
BindingResult result,
ModelAndView modelAndView,
HttpServletRequest request) throws Exception
{
registrationValidator.validate(registrationForm, result);
if(result.hasErrors())
{
return setupForm(modelAndView, registrationForm);
}
else
{
try
{
// ... Some non-transactional operations...
// The following operation is the only one annotated with @Transactional
// myExampleDao is @Autowired, can throw exception
myExampleDao.createFoo(bar);
// ... Other non-transactional operations...
return new ModelAndView("redirect:successful");
}
catch(Exception e)
{
throw new RegistrationException(e, registrationForm, result);
}
}
}
@ExceptionHandler(value = RegistrationException.class)
public ModelAndView registrationExceptionHandler(RegistrationException e) throws Exception
{
RegistrationForm registrationForm = e.getRegistrationForm();
BindingResult result = e.getBindingResult();
result.reject("exception", e.getMessage());
Map<String, Object> model = result.getModel();
return setupForm(new ModelAndView("registration", model), registrationForm);
}
private ModelAndView setupForm(ModelAndView modelAndView, RegistrationForm registrationForm) throws Exception
{
Map<String,Object> model = modelAndView.getModel();
model.put("currentYear", Calendar.getInstance().get(Calendar.YEAR));
return new ModelAndView("registration", model);
}
Проблема, с которой я сталкиваюсь, заключается в том, что при возникновении исключения транзакция не откатывается.
Кто-нибудь может помочь?
Спасибо.
Обновление: немного изменил вопрос для лучшего понимания
Обновление: нашел довольно ужасное решение для отображениясообщение об исключении в представлении.По-прежнему сталкиваюсь с проблемой транзакции, которая не откатывается при возникновении исключения.
Обновление: Я изменил @Transactional
на @Transactional(rollbackFor = Exception.class)
в методе MyExampleDao.createFoo(...)
и теперь всеработает отлично.Это решение все еще уродливое ИМО, у кого-нибудь есть лучшее решение?