2

我一直在寻找一种在 Spring MVC 3 中使表单验证尽可能简单和不显眼的方法。我喜欢 spring 通过将 @Valid 传递给我的模型(已使用验证器注释进行注释)并使用result.hasErrors() 方法。

我正在设置我的控制器操作,如下所示:

@RequestMapping(value = "/domainofexpertise", method = RequestMethod.PUT)
public String addDomainOfExpertise(@ModelAttribute("domainOfExpertise") 
@Valid DomainOfExpertise domainOfExpertise, final BindingResult result) {

    if (result.hasErrors()) {
        return "/domainofexpertise/add";
    } else {
        domainOfExpertiseService.save(domainOfExpertise);
        return "redirect:/admin/domainofexpertise/list";
    }
}

这就像一个魅力。数据库异常(例如尝试在字段上保存具有唯一约束的内容)仍然可以通过。有没有办法在幕后进行的验证过程中捕获这些异常?这种验证方式非常简洁,所以我想避免在我的控制器中手动捕获它们。

有这方面的信息吗?

4

1 回答 1

3

这是我用来将 PersistentExceptions 转换为更友好的消息的示例。它是控制器中的一种方法。这对你有用吗?

/**
 * Shows a friendly message instead of the exception stack trace.
 * @param pe exception.
 * @return the exception message.
 */
@ExceptionHandler(PersistenceException.class)
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handlePersistenceException(final PersistenceException pe) {
    String returnMessage;
    if (pe.getCause()
            instanceof ConstraintViolationException) {
        ConstraintViolationException cve =
                (ConstraintViolationException) pe.getCause();
        ConstraintViolation<?> cv =
                cve.getConstraintViolations().iterator().next();
        returnMessage = cv.getMessage();
    } else {
        returnMessage = pe.getLocalizedMessage();
    }
    if (pe instanceof EntityExistsException) {
        returnMessage = messages.getMessage("user.alreadyexists");
    }
    return returnMessage;
}
于 2012-05-10T20:00:38.203 回答