【Web开发】Spring MVC 中的异常解析器

Spring MVC 的异常解析

  • 核⼼接⼝

    • HandlerExceptionResolver
  • 实现类

    • SimpleMappingExceptionResolver
    • DefaultHandlerExceptionResolver
    • ResponseStatusExceptionResolver
    • ExceptionHandlerExceptionResolver

异常解析器

https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-exceptionhandlers

如果在请求映射期间发生异常或从请求处理程序(例如@Controller)抛出异常,DispatcherServlet将委托给HandlerExceptionResolver bean链来解决异常并提供替代处理,这通常是一个错误响应。

下表列出了可用的HandlerExceptionResolver实现:

异常处理解析器描述
SimpleMappingExceptionResolver异常类名和错误视图名之间的映射。用于在浏览器应用程序中呈现错误页面。
DefaultHandlerExceptionResolver解决Spring MVC引发的异常,并将它们映射到HTTP状态码。参见可选的ResponseEntityExceptionHandler和REST API exceptions
ResponseStatusExceptionResolver使用@ResponseStatus注解解决异常,并基于注解中的值将其映射到HTTP状态码
ExceptionHandlerExceptionResolver通过调用@Controller或@ControllerAdvice类中的@ExceptionHandler方法来解决异常。参见@ExceptionHandler methods

解析器链

您可以通过在Spring配置中声明多个HandlerExceptionResolver bean并根据需要设置它们的order属性来形成异常解析器链。order属性越高,异常解析器的位置越晚。

HandlerExceptionResolver的约定/规定指定它可以返回:

  • 指向错误视图的ModelAndView。
  • 如果异常是在解析器中处理的,则为空的ModelAndView。
  • 如果异常仍然未解决,则为null,以便后续的解析器尝试;如果异常在结束时仍然存在,则允许它向上传递到Servlet容器。

MVC Config 会自动为默认的Spring MVC异常、@ResponseStatus注解异常以及对@ExceptionHandler方法的支持声明内置解析器。您可以自定义该列表或替换它。

容器的错误页面

如果任何HandlerExceptionResolver仍然无法解析异常,以致让其传播,或者将响应状态设置为错误状态(即4xx, 5xx), Servlet容器可以用HTML呈现默认的错误页面。要自定义容器的默认错误页面,可以在web.xml中声明一个错误页面映射。下面的例子展示了如何做到这一点:

<error-page>
    <location>/error</location>
</error-page>

对于前面的示例,当出现异常或响应具有错误状态时,Servlet容器在容器内向配置的URL(例如/error)发出ERROR分派。然后DispatcherServlet对其进行处理,可能将其映射到@Controller,它可以被实现为返回带有模型的错误视图名或呈现JSON响应,如下面的示例所示:

@RestController
public class ErrorController {

    @RequestMapping(path = "/error")
    public Map<String, Object> handle(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("status", request.getAttribute("javax.servlet.error.status_code"));
        map.put("reason", request.getAttribute("javax.servlet.error.message"));
        return map;
    }
}

Servlet API不提供在Java中创建错误页面映射的方法。但是,可以同时使用WebApplicationInitializer和最小的web.xml。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值