У меня есть приложение Spring MVC, которое использует Hibernate 4 для сохранения в базе данных (довольно часто, я знаю) ха-ха.Возвращение исключения ограничения Oracle в BindingResult в Spring MVC/Hibernate
В моем контроллере, у меня есть мой метод POST определяется как:
@RequestMapping(method = RequestMethod.POST)
public String processSubmit(HttpServletRequest request, ModelMap model, @ModelAttribute("command") TemplateVO command, BindingResult result, RedirectAttributes redirectAttrs) {
...
service.addTemplate(command, result);
...
}
Этот метод принимает в форме объекта, заполнит Entity и вызывает метод session.save()
.
@Override
public void addTemplate(TemplateVO form, Errors errors) {
TemplateEntity template = convert(form);
save(template, errors);
}
Вот save()
метод:
@Override
public void save(Object saveObject, Errors errors) {
try {
session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
// Save the object
session.save(saveObject);
}catch (Exception e) {
log.error("Error with Hibernate: ", e);
session.getTransaction().rollback();
}finally {
try {
session.getTransaction().commit();
session.close();
}catch(ConstraintViolationException cve) {
log.error("Oracle constraint violation: ", cve);
errors.reject("error.someError");
errors.rejectValue("mainText",
"error.someError",
new Object[]{"test"},
"Some error occurred");
}catch (NullPointerException npe) {
log.error("Error closing session. Session is NULL", npe);
}catch (Exception e) {
log.error("Unknown error thrown when saving:", e);
}
}
}
Коды ошибок существуют в файле messages.properties.
В Oracle у меня есть уникальное ограничение на вызов GUID полей. Я тестирую приложение сейчас и пытаюсь ввести GUID с тем же именем, что и уже существующее. Это прекрасно работает, и уникальное ограничение бросается и попадает в код выше.
Я пытаюсь заполнить errors
пару способов. Я попытался с помощью <form:errors path="*" cssClass="errorblock" element="div" />
, но ничего не покажет, так что я попытался придумать своему, делая это, прямо под вызовом addTemplate()
:
if (result.hasErrors()) {
List<ObjectError> errorList = result.getGlobalErrors();
String errors = "";
for (FieldError error : errorList) {
errors += error.getDefaultMessage() + "\n";
}
...
}
Однако выше всегда только отображается «нулевой».
Итак, как я могу вернуть ошибку из метода save()
и вернуть его полностью обратно в контроллер?
Большое спасибо за помощь!