墨风如雪博客

  • 源码小店
  • 导航站
  • 登录
  • java
  • 资源分享
让AI使用变得如此简单
  1. 首页
  2. java
  3. spring
  4. 正文

SpringMVC 核心组件HandlerExceptionResolver的详解和应用

2023年 5月 20日 194点热度 0人点赞 0条评论

一、概述

1.1 HandlerExceptionResolver 的作用

HandlerExceptionResolver是Spring MVC的核心组件之一,用于处理控制器方法执行过程中抛出的异常。它可以将异常转换成合适的视图,或者将异常信息记录下来以便后续处理。

1.2 了解显示异常处理流程

在了解HandlerExceptionResolver之前,需要了解Spring MVC的异常处理流程。当控制器方法执行过程中抛出异常时,Spring MVC会按照以下顺序进行异常处理:

  1. 如果控制器方法定义了@ExceptionHandler注解,则会调用对应的异常处理方法进行处理。
  2. 如果控制器方法未定义@ExceptionHandler注解,则会将异常抛出到DispatcherServlet。
  3. DispatcherServlet会将异常交给HandlerExceptionResolver进行处理。
  4. 如果没有合适的HandlerExceptionResolver进行处理,DispatcherServlet会将异常交给Servlet容器进行处理。

二、常见ExceptionResolver实现类

2.1 SimpleMappingExceptionResolver

SimpleMappingExceptionResolver是一个基于异常类型和视图名称的异常解析器。它可以根据异常类型匹配对应的视图名称,并将异常信息传递给视图进行渲染。

public class SimpleMappingExceptionResolver extends AbstractHandlerExceptionResolver {

    private Map<Class<? extends Throwable>, String> exceptionMappings;

    @Override
    protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        String viewName = findViewName(ex);
        return getModelAndView(viewName, ex);
    }

    // ...
}

上述代码中,SimpleMappingExceptionResolver继承了AbstractHandlerExceptionResolver抽象类,并重写了doResolveException方法。doResolveException方法根据异常类型和视图名称进行匹配,并将异常信息传递给视图进行渲染并返回ModelAndView对象。

2.2 DefaultHandlerExceptionResolver

DefaultHandlerExceptionResolver是Spring MVC默认的异常处理器。它可以处理常见的异常类型,并将异常信息记录到日志中。

public class DefaultHandlerExceptionResolver extends AbstractHandlerExceptionResolver {

    @Override
    protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        if (ex instanceof HttpMediaTypeNotAcceptableException) {
            response.setStatus(HttpServletResponse.SC_NOT_ACCEPTABLE);
            return new ModelAndView();
        }
        // ...
    }

    // ...
}

上述代码中,DefaultHandlerExceptionResolver继承了AbstractHandlerExceptionResolver抽象类,并重写了doResolveException方法。doResolveException方法处理常见的异常类型,并将异常信息记录到日志中。

2.3 ResponseStatusExceptionResolver

ResponseStatusExceptionResolver是用于处理使用@ResponseStatus注解声明的异常的HandlerExceptionResolver实现类。它可以将注解中定义的状态码和原因短语设置到响应头中。

public class ResponseStatusExceptionResolver extends AbstractHandlerExceptionResolver {

    @Override
    protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        ResponseStatus responseStatus = AnnotationUtils.findAnnotation(ex.getClass(), ResponseStatus.class);
        if (responseStatus != null) {
            applyResponseStatus(response, responseStatus);
            return new ModelAndView();
        }
        // ...
    }

    // ...
}

上述代码中,ResponseStatusExceptionResolver继承了AbstractHandlerExceptionResolver抽象类,并重写了doResolveException方法。doResolveException方法根据@ResponseStatus注解中定义的状态码和原因短语设置响应头并返回空的ModelAndView对象。

三、自定义ExceptionResolver

3.1 实现HandlerExceptionResolver接口

要自定义HandlerExceptionResolver,需要实现HandlerExceptionResolver接口,并实现doResolveException方法。在doResolveException方法中,可以根据异常类型和需要的处理方式进行自定义处理。

3.2 注册到Spring配置中

自定义HandlerExceptionResolver需要注册到Spring配置中,可以使用标签或者在Java配置类中使用@EnableWebMvc注解来启用Spring MVC注解驱动。然后在DispatcherServlet的配置中,将自定义HandlerExceptionResolver添加到resolver中即可。

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {

    @Bean
    public HandlerExceptionResolver customExceptionResolver() {
        return new CustomExceptionResolver();
    }

    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
        resolvers.add(customExceptionResolver());
    }

    // ...
}

上述代码中,使用Java配置类来配置自定义HandlerExceptionResolver。首先使用@EnableWebMvc注解启用Spring MVC注解驱动,然后定义一个customExceptionResolver方法来返回自定义的HandlerExceptionResolver实现类。最后在configureHandlerExceptionResolvers方法中将自定义HandlerExceptionResolver添加到resolver中。

四、扩展

4.1 实现HandlerExceptionResolverComposite

如果需要扩展多个HandlerExceptionResolver,可以实现HandlerExceptionResolverComposite接口。HandlerExceptionResolverComposite接口可以将多个HandlerExceptionResolver组合起来,形成一个处理器链,按照顺序依次处理异常。

public class CustomExceptionResolverComposite implements HandlerExceptionResolverComposite {

    private List<HandlerExceptionResolver> resolvers;

    public CustomExceptionResolverComposite(List<HandlerExceptionResolver> resolvers) {
        this.resolvers = resolvers;
    }

    @Override
    public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
        resolvers.addAll(this.resolvers);
    }

    // ...
}

上述代码中,CustomExceptionResolverComposite实现了HandlerExceptionResolverComposite接口,并在extendHandlerExceptionResolvers方法中将传入的HandlerExceptionResolver添加到处理器链中。

4.2 使用自定义ExceptionResolver

可以在Spring MVC的配置中使用自定义HandlerExceptionResolver。除了在Java配置类中使用@Bean方法配置HandlerExceptionResolver外,还可以使用标签的exception-resolver属性来配置。可以将多个HandlerExceptionResolver组合起来,形成一个处理器链,按照顺序依次处理异常。

<mvc:annotation-driven>
    <mvc:exception-resolvers>
        <bean class="com.example.CustomExceptionResolver1"/>
        <bean class="com.example.CustomExceptionResolver2"/>
    </mvc:exception-resolvers>
</mvc:annotation-driven>

上述代码中,使用标签的exception-resolver属性来配置多个HandlerExceptionResolver。customExceptionResolver1和customExceptionResolver2会形成一个处理器链,按照顺序依次处理异常。

五、总结

HandlerExceptionResolver是Spring MVC的核心组件之一,用于处理控制器方法执行过程中抛出的异常。本文介绍了HandlerExceptionResolver的作用、常见实现类、自定义ExceptionResolver以及使用HandlerExceptionResolverComposite扩展实现。需要注意的是,不同的HandlerExceptionResolver可能会产生不同的结果,需要根据实际需求进行选择。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: HandlerExceptionResolver java JDK MVC spring springMVC 三层架构 核心组件
最后更新:2023年 5月 15日

墨风如雪

一个热爱生活,热爱分享的程序员

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

墨风如雪

一个热爱生活,热爱分享的程序员

最新 热点 随机
最新 热点 随机
降维打击!Mistral Voxtral:开源语音的“终结者”已上线! AI“游侠”降临A股:16个“大脑”组团“炒股”,30秒“算命”市场! 视频魔法来了!AI能实时“变脸”直播,连游戏画面也能瞬间换装? 告别“听指令”,AI要“自己动手”了!ChatGPT Agent,AI界的“全能选手”已上线! 8B 模型吊打 671B?数学证明界“卷王”Goedel-Prover-V2 来了! Kiro来了!亚马逊放大招,软件开发要被AI“绑架”了吗?
昆仑万维扔出王炸:32B模型干翻671B,代码界迎来全能修理工!8亿参数撬动实时混音!谷歌开源“口袋DJ”,人人都能玩转音乐告别插件时代!OmniGen2:一个模型,通吃所有AIGC神操作2000万次呼唤背后,蓝骑士有了“赛博外挂”智能触手可及:Google Gemma-3n 系列模型,让万物皆能“思考”AI圈大地震!120亿参数的FLUX编辑器开源,你的显卡准备好了吗?
豆包1.5深度思考模型:全面超越DeepSeek R1?不,它开启了AI的“全能时代”! 每日算法题:反转链表 再见,5秒限制!昆仑万维SkyReels-V2开源,AI视频迈入“电影时代”? DeepSeek-R1T-Chimera:当R1的智慧,遇上V3的速度!开源AI新物种驾到! 8B 模型吊打 671B?数学证明界“卷王”Goedel-Prover-V2 来了! OpenAI GPT-4o:颠覆创作流程的“全能画手”来了
标签聚合
设计模式 spring 教程 大模型 算法 deepseek java AI

COPYRIGHT © 2023 墨风如雪博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

免责声明 - 隐私政策