Spring mvc Spring ExceptionHandler访问模型?
我有一个spring控制器,它使用bean验证来验证输入值,例如保存一个主题: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
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请求属性中。如果可能的话,添加代码示例以使您的答案更清晰。