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();
}
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();
}
}
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());
}
2
3
4
5
使用extendHandlerExceptionResolvers
不会覆盖默认的异常处理器,只会在其基础上添加自定义处理器。
# 6. 测试自定义异常处理器
创建一个简单的控制器方法,故意抛出异常以测试自定义的异常处理逻辑:
@RestController
public class TestController {
@GetMapping("/testException")
public String testException() {
// 人为抛出异常以测试自定义异常处理器
throw new RuntimeException("This is a test exception!");
}
}
2
3
4
5
6
7
8
9
访问http://localhost:8080/testException
,应当返回自定义的错误消息,如Error: This is a test exception!
。
# 7. 注意事项
- 在使用
configureHandlerExceptionResolvers
方法时,务必注意它会覆盖默认的异常处理器。如果不希望失去默认的异常处理逻辑,可以选择使用extendHandlerExceptionResolvers
。 - 确保自定义异常处理器的顺序优先级正确,以避免与默认处理器或其他处理器发生冲突。
总结
通过自定义异常处理器,Spring MVC能够实现统一的异常处理逻辑,并提供灵活的扩展机制。无论是覆盖默认处理器还是在其基础上扩展,Spring都提供了丰富的接口与配置选项,以满足复杂的业务需求。