web九大组件之---HandlerExceptionResolver异常处理器使用详解【享学Spring MVC】(下)

简介: web九大组件之---HandlerExceptionResolver异常处理器使用详解【享学Spring MVC】(下)

使用示例


简单的演示一下使用的Demo:


@Controller
@RequestMapping
public class HelloController {
    @ResponseBody
    @GetMapping("/test/exception")
    public int testException(@RequestParam(required = false, defaultValue = "1") Integer value) {
        if (value == 100) {
            // 状态码设置为501 方便识别
            throw new ResponseStatusException(HttpStatus.NOT_IMPLEMENTED, "服务端发生异常啦");
        }
        return 10 / value;
    }
}

访问以及结果的截图如下:


image.png


异常处理过程分析:


  • value值传0,处理器(HandlerMethod)会抛出计算异常:ArithmeticException(/ by zero)。此异常交给默认注册上去的三个异常处理器进行处理,发现:没有一个HandlerExceptionResolver可以处理这种异常类型,所以经过DispatcherServlet#processHandlerException处理后得到的ModelAndView为null(无异常视图),因此最终的结果是:执行完afterCompletion()方法后,throw ex交给web容器去处理。这就是我们如上截图看到的结果页面,连异常代码都有,极度的不友好有木有。


若value值换位100,这样异常类型能能被处理器处理的,结果如何呢?看下截图:


image.png


异常处理过程分析:


  • 此异常经过ResponseStatusExceptionResolver处理后得到一个ModelAndView,但exMv.isEmpty() = true的,因此异常不会throw出来而是return null。所以最终因为ModelAndView是空的但异常也没throw出来,最终就是把response返回喽(已经设置好返回状态码和错误消息的response),显然这种方式虽然比上面稍好(没有错误代码了),但对用户来说也是不友好的。


备注:本文并不演示最为强大、复杂的ExceptionHandlerExceptionResolver,也就是不演示@ExceptionHandler方式,因为它的详解在此处专文讲解


自定义HandlerExceptionResolver处理异常


上面两个案例都是使用Spring MVC内置的异常处理器,显然用户体验均非常不友好。所以在实际生产环境,必须是需要自己来处理异常(页面)的,下面采用自定义HandlerExceptionResolver方式给出Demo案例,仅供参考:


1、自定义异常处理类并配置上去(本例以匿名内部类方式处理):

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    @Override
    public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
        // 自定义异常处理器一般请放在首位
        exceptionResolvers.add(0, new AbstractHandlerExceptionResolver() {
            @Override
            protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
                // 若是自定义的业务异常,那就返回到单页面异常页面
                if (ex instanceof BusinessException) {
                    return new ModelAndView("/business.jsp");
                } else { // 否则统一到统一的错误页面
                    return new ModelAndView("/error.jsp");
                }
            }
        });
    }
}


2、对应的准备两个错误页面


image.png


3、请求示例截图如下(value=0 or 100):


image.png


image.png


相关阅读


@ExceptionHandler or HandlerExceptionResolver?如何优雅处理全局异常?【享学Spring MVC】


总结


我书写本文的目的主要是让大家"善待异常"和重视异常的处理,我认为一个好的程序员应该对异常的处理都是相对妥当的,而不是坐而不理。我相信你在工作中一定遇到过异常处理不妥当而到处吐槽你的团队的现象,那么看了本文后,动起来吧,重视起来吧,处理起来吧,而不是只剩下抱怨了…


不客气的说一句话:微服务的难点在于它的治理,若你统一了技术栈,规范了各种情况的处理(比如远程调用、异常处理、状态码返回、熔断处理等),它将会让你的开发效率、监控、报警问题、定位成本大大减少。所以从某种程度上,它是服务开发、服务治理非常非常重要的一环,所以"代码架构师"真的是非常重要的,而不是什么都只做事后补救,事前预防或许来得更有效。


当然,本文介绍的方案还是不够的,因为更为重要的@ExceptionHandler方式我放在了下一篇文章单独讲解。在当下Rest流行的生产环境下,使用更加强大、更方便的@ExceptionHandler方式是首选。对于它的解释说明和使用Demo,出门右拐可以给你惊喜。同时此时你是否疑问过这个问题:若异常处理器里面抛出了异常,将会怎样呢?答案也一样的出门右拐吧~



相关文章
|
9天前
|
设计模式 前端开发 Java
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
24 4
|
27天前
|
开发框架 Java UED
如何使用 Spring Boot 实现异常处理
如何使用 Spring Boot 实现异常处理
39 2
|
27天前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
102 2
|
2月前
|
前端开发 JavaScript 开发者
Web组件:一种新的前端开发范式
【10月更文挑战第9天】Web组件:一种新的前端开发范式
72 2
|
2月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
2月前
|
前端开发 JavaScript Go
前端开发趋势:从响应式设计到Web组件的探索
【10月更文挑战第1天】前端开发趋势:从响应式设计到Web组件的探索
43 3
|
2月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
65 2
|
1月前
|
消息中间件 监控 Kafka
Apache Kafka 成为处理实时数据流的关键组件。Kafka Manager 提供了一个简洁的 Web 界面
随着大数据技术的发展,Apache Kafka 成为处理实时数据流的关键组件。Kafka Manager 提供了一个简洁的 Web 界面,方便管理和监控 Kafka 集群。本文详细介绍了 Kafka Manager 的部署步骤和基本使用方法,包括配置文件的修改、启动命令、API 示例代码等,帮助你快速上手并有效管理 Kafka 集群。
51 0
|
2月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
192 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
166 3