墨风如雪博客

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

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

2023年 5月 20日 155点热度 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日

墨风如雪

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

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

文章评论

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

墨风如雪

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

最新 热点 随机
最新 热点 随机
小红书AI新里程碑:dots.llm1,中文MoE的“人文”突破! 告别机械感!OpenAudio S1让AI声音活起来 Sora触手可及!微软必应AI视频生成器,全民创作时代来临? 阿里WebAgent开源:引领自主搜索新纪元 重磅炸弹!字节跳动开源BAGEL:70亿参数,统一多模态理解与生成,AI“全能王”诞生记! 小米MiMo-VL:7B参数,怎么就成了多模态界的“越级打怪王”?
AI圈炸锅了!Mistral Medium 3:性能 SOTA,成本打骨折,企业玩家的新宠?字节终于开源“扣子”同款引擎了!FlowGram:AI 时代的可视化工作流利器告别“微信黑箱”!Chatlog:让你的聊天记录也能拥有“AI大脑”!字节跳动 Seed-Coder-8B:不靠人工洗数据,这80亿参数的小模型如何写出顶尖代码?85倍速的视觉革命:苹果发布 FastVLM,让你的 iPhone ‘看图说话’,快到飞起!告别AI视频“变脸怪”!腾讯混元Hunyuan Custom重磅开源,主体一致性“王炸”来了!
Spring 三级缓存能解决什么问题和原理(超详细) 国产AI视频迈入“高可控”时代?Vidu Q1重磅发布,这几个点太炸裂了! java Web框架Spring MVC的(超详细总结) Java线程池参数和调优 设计模式:访问者设计模式 java 消息队列框架RabbitMQ的(超详细总结)
标签聚合
教程 算法 java 动态规划 deepseek AI spring 设计模式

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

Theme Kratos Made By Seaton Jiang

免责声明 - 隐私政策