程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • SpringMVC

    • SpringMVC 入门
    • Spring MVC 数据接收
    • Spring MVC 数据返回
    • Spring MVC 路径匹配规则
    • Spring MVC 内容协商策略
    • Spring MVC 异步请求处理
    • Spring MVC 静态资源处理
    • Spring MVC 自定义格式化器
    • SpringMVC 自定义拦截器
    • SpringMVC 配置跨域(CORS)
    • Spring MVC 自定义视图控制器
    • Spring MVC 自定义视图解析器
    • Spring MVC 自定义方法参数解析器
    • Spring MVC 自定义返回值处理器
    • Spring MVC 自定义消息转换器
    • Spring MVC 消息转换器扩展
    • Spring MVC 自定义异常处理器
      • 1. 配置自定义异常处理器
      • 2. 实现自定义异常处理器
      • 3. 关键配置参数与实现说明
      • 4. 异常处理器的优先级问题
      • 5. 覆盖与扩展异常处理器
      • 6. 测试自定义异常处理器
      • 7. 注意事项
    • Spring MVC 自定义异常处理器扩展
  • SpringMVC
  • SpringMVC
scholar
2024-08-17
目录

Spring MVC 自定义异常处理器

# Spring MVC 自定义异常处理器

提示

在 Spring MVC中,异常处理器(HandlerExceptionResolver)用于统一处理请求过程中发生的各种异常。通过实现自定义异常处理器,开发者可以灵活地对特定异常进行定制化处理。本节将详细总结如何通过configureHandlerExceptionResolvers方法注册自定义异常处理器,以及如何解决常见的失效问题。

# 1. 配置自定义异常处理器

在Spring MVC中,通过configureHandlerExceptionResolvers方法注册自定义异常处理器可以覆盖默认的异常处理器。以下是自定义异常处理器的完整配置过程。

@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
    // 注册自定义的异常处理器
    resolvers.add(myExceptionResolver());
}

@Bean
public MyExceptionResolver myExceptionResolver() {
    // 创建自定义异常处理器的实例
    return new MyExceptionResolver();
}
1
2
3
4
5
6
7
8
9
10
11

# 2. 实现自定义异常处理器

自定义异常处理器可以通过继承AbstractHandlerExceptionResolver类实现。该类是Spring提供的异常处理器抽象实现,简化了自定义异常处理器的开发。以下是实现自定义异常处理器的示例代码:

public class MyExceptionResolver extends AbstractHandlerExceptionResolver {

    @Override
    public int getOrder() {
        // 设置异常处理器的优先级。值越小,优先级越高。
        return -999999;
    }

    @Override
    protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        // 自定义的异常处理逻辑
        try {
            // 将异常信息写入响应体
            response.getWriter().write("Error: " + ex.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 返回一个空的ModelAndView,表示不再进行其他处理
        return new ModelAndView();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 3. 关键配置参数与实现说明

  • getOrder 方法:通过实现Ordered接口并重写getOrder方法,可以控制异常处理器的执行顺序。值越小,优先级越高。为了确保自定义异常处理器优先执行,通常将其值设置为一个较小的负数(如-999999)。

  • doResolveException 方法:这是异常处理的核心逻辑所在。可以在这里进行异常信息的记录、响应的处理等。注意,如果返回一个非空的ModelAndView,后续的异常处理器将不会被执行。

  • response.getWriter().write(...):通过直接写入响应体的方式返回错误信息,适用于返回自定义错误消息或错误页面。

# 4. 异常处理器的优先级问题

Spring MVC中的异常处理器是按顺序执行的,默认情况下,Spring提供了一系列内置的异常处理器。如果自定义的异常处理器没有生效,通常是因为它的优先级低于内置的异常处理器,导致它没有被执行。

解决方案:

通过设置较低的getOrder值来确保自定义异常处理器在处理链中优先执行。例如,设置getOrder为-999999,确保它在默认异常处理器之前生效。

# 5. 覆盖与扩展异常处理器

在configureHandlerExceptionResolvers中自定义的异常处理器会覆盖默认的异常处理器。如果只想在默认处理器基础上进行扩展,可以使用extendHandlerExceptionResolvers方法:

@Override
public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
    // 在默认处理器的基础上扩展
    resolvers.add(myExceptionResolver());
}
1
2
3
4
5

使用extendHandlerExceptionResolvers不会覆盖默认的异常处理器,只会在其基础上添加自定义处理器。

# 6. 测试自定义异常处理器

创建一个简单的控制器方法,故意抛出异常以测试自定义的异常处理逻辑:

@RestController
public class TestController {

    @GetMapping("/testException")
    public String testException() {
        // 人为抛出异常以测试自定义异常处理器
        throw new RuntimeException("This is a test exception!");
    }
}
1
2
3
4
5
6
7
8
9

访问http://localhost:8080/testException,应当返回自定义的错误消息,如Error: This is a test exception!。

# 7. 注意事项

  • 在使用configureHandlerExceptionResolvers方法时,务必注意它会覆盖默认的异常处理器。如果不希望失去默认的异常处理逻辑,可以选择使用extendHandlerExceptionResolvers。
  • 确保自定义异常处理器的顺序优先级正确,以避免与默认处理器或其他处理器发生冲突。

总结

通过自定义异常处理器,Spring MVC能够实现统一的异常处理逻辑,并提供灵活的扩展机制。无论是覆盖默认处理器还是在其基础上扩展,Spring都提供了丰富的接口与配置选项,以满足复杂的业务需求。

编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
Spring MVC 消息转换器扩展
Spring MVC 自定义异常处理器扩展

← Spring MVC 消息转换器扩展 Spring MVC 自定义异常处理器扩展→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式