Spring mvc Spring ExceptionHandler访问模型?

Spring mvc Spring ExceptionHandler访问模型?,spring-mvc,exception-handling,Spring Mvc,Exception Handling,我有一个spring控制器,它使用bean验证来验证输入值,例如保存一个主题: public String save(@ModelAttribute("topic") @Valid Topic topic 这很有效 在我的数据层中,我也使用bean验证,当一些无效的东西被发送到数据层时,将抛出ConstraintViolationException。我用exceptionhandler在我的控制器中捕捉到这个: @ExceptionHandler({ ConstraintViolationEx

我有一个spring控制器,它使用bean验证来验证输入值,例如保存一个主题:

public String save(@ModelAttribute("topic") @Valid Topic topic
这很有效

在我的数据层中,我也使用bean验证,当一些无效的东西被发送到数据层时,将抛出ConstraintViolationException。我用exceptionhandler在我的控制器中捕捉到这个:

@ExceptionHandler({ ConstraintViolationException.class })
public ModelAndView  handleValidationException(HttpServletRequest req,ConstraintViolationException e) {
这也很有效

我面临的问题是,我无法在exceptionhandler中访问模型,文档中明确指出:

Important Note: the Model may not be a parameter of any @ExceptionHandler method.
需要访问模型,因为我想向用户显示视图以及他刚刚填写的表单。但因为我无法访问模型,所以无法获取填写的表单数据

我发现的一个解决方案是在save方法中捕获ConstraintViolationException,因为在这里我确实可以访问模型

但我更喜欢一个通用的解决方案,当我需要将某些内容保存到数据库时,不要使用混乱的try/catch/finally

有人知道一个好的解决办法吗

[编辑] 以下是我当前的异常处理程序:

@ExceptionHandler({ ConstraintViolationException.class })
public ModelAndView  handleValidationException(HttpServletRequest req,ConstraintViolationException e) {
log.debug("handleValidationException");

//no access to model, so i create new one, but this new one doesn't have the values the user entered in the html form.

ModelAndView mav = new ModelAndView();
mav.addObject("exception", e);
mav.setViewName("add_topc");
return mav;
}

经过对这个问题的思考,我得出结论,一个错误页面显示一个错误就足够了。主要是因为数据层抛出的错误是致命的错误,用户无法纠正,例如通过更改字段值。当然,在出错的上下文中显示错误页面并保存用户输入会很好。但是春天似乎不可能做到这一点。

有点老了,但我发现自己也处于类似的情况

一种可能的解决方案是将模型包装在ContrainViolationException中,以便异常处理程序可以从异常中提取模型

我还没有找到关于为什么模型在异常处理程序中被清除/不可用的任何好的解释,除了有人假设它是设计的,因为模型可能处于无效状态

来自控制器的狙击手

...  
throw new ConstraintViolationException(model);
来自ModelAwareException的SNIPET

public void ConstraintViolationException(Model saveModel)  {
    this.model = saveModel;
}
例外处理程序中的SNIPET

@ExceptionHandler({ ConstraintViolationException.class })
public ModelAndView  handleValidationException(HttpServletRequest req,ConstraintViolationException e, Model unpopulatedSpringModel) {

    unpopulatedSpringModel = e.getModel();
    return new ModelAndView("yourpage");

}

我们能看看你的@ExceptionHandler在做什么吗?主题对象应该已经在模型中。我已经将exceptionhandler添加到问题中。如文档中所述,并且在我的问题中指出,该模型可能不是任何@ExceptionHandler方法的参数。。如果我理解正确,则主题对象在exceptionhandler中不可用,因为包含该主题对象的模型在exceptionhandler中不可用。是否要对实际的主题对象执行任何操作?从@ExceptionHandler返回的ModelAndView将与@Controller handler方法使用的模型合并。是否确实要合并?情况似乎并非如此,在我看来,除了在exceptionhandler中设置的模型数据之外,没有其他可用的模型数据。如果我从exceptionhandler以字符串形式返回视图名称,则没有可用的模型数据。重新查看源代码,似乎我错了。考虑将属性直接放入HTTPServices请求属性中。如果可能的话,添加代码示例以使您的答案更清晰。