【问题标题】:Can Spring MVC catch an exception and return a BindingResult in the response for all controllers?Spring MVC 可以捕获异常并在所有控制器的响应中返回 BindingResult 吗?
【发布时间】:2016-12-20 00:01:22
【问题描述】:

我正在尝试利用我的应用程序服务层上的现有验证框架,该框架在验证失败时抛出 ValidationException。这个异常对象包含多个错误,我想利用 Spring MVC 中的异常处理程序来提取这些错误并将验证消息返回到视图 (thymeleaf)。

所以我有两个关于如何做到这一点的问题:

1) 我可以从自定义错误对象列表中手动创建 BindingResult 对象以传递给视图层吗?

2) 我可以从基本 Controller 中的处理程序中捕获 ValidationException(可以从多个方法中抛出)并让它拦截响应并返回带有验证消息的视图吗?还是我必须在每个可能被抛出的控制器方法中尝试/捕获这个异常并在那里提取绑定结果?

显然,如果所有这些都发生在一个地方会更好——如果一个处理程序可以捕获 ValidationException 并将错误消息注入视图。但是该方法可以访问返回的模型和视图吗?有关此架构的任何建议都会非常有帮助。

【问题讨论】:

    标签: java spring spring-mvc spring-validator


    【解决方案1】:

    你查过谷歌吗?我的第一个打击是 https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc
    这将允许您使用正确的模型返回所需异常的视图。

    还要查看异常处理程序的 spring 文档? http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/HandlerExceptionResolver.html

    然后问题就变成了如何检索绑定结果。如果我用谷歌搜索它,它看起来可以作为请求属性使用: Spring 3 web request interceptor - how do I get BindingResult?

    【讨论】:

    • 谢谢,差不多了 - 问题出在异常处理程序中,如果我捕捉到 ValidationException,我不知道要返回什么视图(这不是通用视图 - 我想要它是提交的最后一页)我唯一能想到的就是查看引用者或将视图作为请求属性传递,这非常难看。
    • 你一定要看看referer。如果您使用的是 Post-Redirect-Get,则引用者应该正是您想要返回的页面(因为最后一个请求是 Get)。另一种选择是有一个单独的过滤器/处理程序拦截器,它将最后一个视图附加到会话中,然后使用它——但这需要使用会话。如果您使用会话,这可能是您最简单的解决方案:让它返回之前返回的视图!
    猜你喜欢
    • 2016-10-29
    • 1970-01-01
    • 2012-12-22
    • 2011-04-11
    • 2014-05-21
    • 2017-06-27
    • 1970-01-01
    • 2012-06-23
    • 2013-11-10
    相关资源
    最近更新 更多