2014-11-21 6 views
0

У меня есть приложение 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() и вернуть его полностью обратно в контроллер?

Большое спасибо за помощь!

ответ

0

Проблема заключалась в следующем:

List<ObjectError> errorList = result.getGlobalErrors(); 

Это должно было быть:

List<FieldError> errorList = result.getFieldErrors(); 

После переключения, теперь я получаю сообщение об ошибке

Смежные вопросы