在Spring MVC / Hibernate中的BindingResult中返回Oracle约束异常

时间:2014-11-21 14:29:42

标签: java hibernate spring-mvc

我有一个Spring MVC应用程序使用Hibernate 4来保存到数据库(很常见,我知道)哈哈。

在我的Controller中,我的POST方法定义为:

@RequestMapping(method = RequestMethod.POST)
public String processSubmit(HttpServletRequest request,  ModelMap model, @ModelAttribute("command") TemplateVO command, BindingResult result, RedirectAttributes redirectAttrs) {
    ...
    service.addTemplate(command, result);
    ...
}

此方法接受表单对象,填充实体并调用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";
    }
    ...
}

但是,上面总是只显示“null”。

所有这些(哈哈),如何从save()方法返回错误并将其一直返回到Controller?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

问题在于:

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

应该是:

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

切换后,我现在收到错误消息