SpringMVC异常处理机制详解[附带源码分析]

别再手动抄表了!用PaddleOCR超轻量模型5分钟搞定数字仪表识别(附完整Python代码) 本文介绍如何利用PaddleOCR超轻量模型快速实现工业仪表数字识别自动化。通过5行核心代码和关键预处理步骤,显著提升识别准确率至98.2%,解决传统OCR在工业场景中的体积大、抗干扰弱等问题,并提供完整Python代码和边缘部署优化方案。 阅读详情

http://www.cnblogs.com/fangjian0423/p/springMVC-exception-analysis.html

目录

前言

SpringMVC是目前主流的Web MVC框架之一。 

如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html

本文将分析SpringMVC的异常处理内容,让读者了解SpringMVC异常处理的设计原理。

重要接口和类介绍

1. HandlerExceptionResolver接口

   SpringMVC异常处理核心接口。该接口定义了1个解析异常的方法:

   ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;

2. AbstractHandlerExceptionResolver抽象类

  实现了HandlerExceptionResolver和Ordered接口的抽象类。

  先看下属性:

  再看下接口的实现:

3. AbstractHandlerMethodExceptionResolver抽象类

  继承AbstractHandlerExceptionResolver抽象类的抽象类。 该类主要就是为HandlerMethod类服务,既handler参数是HandlerMethod类型。

  该类重写了shouldApplyTo方法:

  doResolveException抽象方法的实现中调用了doResolveHandlerMethodException方法,该方法也是1个抽象方法。

4. ExceptionHandlerExceptionResolver类

  继承自AbstractHandlerMethodExceptionResolver,该类主要处理Controller中用@ExceptionHandler注解定义的方法。

  该类也是<annotation-driven/>配置中定义的HandlerExceptionResolver实现类之一,大多数异常处理都是由该类操作。

  该类比较重要,我们来详细讲解一下。

  首先我们看下这个类的属性:

  再来看下该类的doResolveHandlerMethodException抽象方法的实现:

  默认的HandlerMethodArgumentResolver集合:

  默认的HandlerMethodReturnValueHandler集合:

  其中关于HandlerMethodArgumentResolver、HandlerMethodReturnValueHandler接口,HandlerMethodArgumentResolverComposite、HandlerMethodReturnValueHandlerComposite类,HandlerMethod、ServletInvocableHandlerMethod类等相关知识的请参考楼主的其他博客:

  详解SpringMVC请求的时候是如何找到正确的Controller、详解SpringMVC中Controller的方法中参数的工作原理

  我们进入getExceptionHandlerMethod方法看看是如何得到ServletInvocableHandlerMethod的:

  我们看到getExceptionHandlerMethod中会实例化ExceptionHandlerMethodResolver,我们看看这个类到底是什么东西?

  ExceptionHandlerMethodResolver是一个会在Class及Class的父类集合中找出带有@ExceptionHandler注解的类,该类带有key为Throwable,value为Method的缓存属性。

  ExceptionHandlerMethodResolver的构造过程:

  ExceptionHandlerExceptionResolver处理过程总结一下:根据用户调用Controller中相应的方法得到HandlerMethod,之后构造ExceptionHandlerMethodResolver,构造ExceptionHandlerMethodResolver有2种选择,1.通过HandlerMethod拿到Controller,找出Controller中带有@ExceptionHandler注解的方法(局部) 2.找到@ControllerAdvice注解配置的类中的@ExceptionHandler注解的方法(全局)。这2种方式构造的ExceptionHandlerMethodResolver中都有1个key为Throwable,value为Method的缓存。之后通过发生的异常找出对应的Method,然后调用这个方法进行处理。这里异常还有个优先级的问题,比如发生的是NullPointerException,但是声明的异常有Throwable和Exception,这时候ExceptionHandlerMethodResolver找Method的时候会根据异常的最近继承关系找到继承深度最浅的那个异常,即Exception。

5. DefaultHandlerExceptionResolver类

  继承自AbstractHandlerExceptionResolver抽象类。<annotation-driven/>配置中定义的HandlerExceptionResolver实现类之一。

  该类的doResolveException方法中主要对一些特殊的异常进行处理,比如NoSuchRequestHandlingMethodException、HttpRequestMethodNotSupportedException、HttpMediaTypeNotSupportedException、HttpMediaTypeNotAcceptableException等。

6. ResponseStatusExceptionResolver类

  继承自AbstractHandlerExceptionResolver抽象类。<annotation-driven/>配置中定义的HandlerExceptionResolver实现类之一。  

  该类的doResolveException方法主要在异常及异常父类中找到@ResponseStatus注解,然后使用这个注解的属性进行处理。

-------------------------------------------------------------------------------------------------------------------------------------------------

说明一下为什么ExceptionHandlerExceptionResolver、DefaultHandlerExceptionResolver、ResponseStatusExceptionResolver是<annotation-driven/>配置中定义的HandlerExceptionResolver实现类。

我们看下<annotation-driven/>配置解析类AnnotationDrivenBeanDefinitionParser中部分代码片段:

这3个ExceptionResolver最终被会加入到DispatcherServlet中的handlerExceptionResolvers集合中。

其中ExceptionHandlerExceptionResolver优先级最高,ResponseStatusExceptionResolver第二,DefaultHandlerExceptionResolver第三。

为什么ExceptionHandlerExceptionResolver优先级最高,因为order属性值最低,这部分的知识请参考:Spring中Ordered接口简介

-------------------------------------------------------------------------------------------------------------------------------------------------

7. @ResponseStatus注解

  让1个方法或异常有状态码(status)和理由(reason)返回。这个状态码是http响应的状态码。

8. SimpleMappingExceptionResolver类

继承自AbstractHandlerExceptionResolver抽象类,是1个根据配置进行解析异常的类,包括配置异常类型,默认的错误视图,默认的响应码,异常映射等配置属性。 本文不分析,有兴趣的读者可自行查看源码。

源码分析

下面我们来分析SpringMVC处理异常的源码。

SpringMVC在处理请求的时候,通过RequestMappingHandlerMapping得到HandlerExecutionChain,然后通过RequestMappingHandlerAdapter得到1个ModelAndView对象,这在之前发生的异常都会被catch到,然后得到这个异常并作为参数传入到processDispatchResult方法处理。

processDispatchResult方法如下:

processHandlerException方法:

实例讲解

接下里讲常用ExceptionResolver的实例。

1. ExceptionHandlerExceptionResolver

@Controller
@RequestMapping(value = "/error")
public class TestErrorController {
  
    @RequestMapping("/exception")
    public ModelAndView exception(ModelAndView view) throws ClassNotFoundException {
        view.setViewName("index");
        throw new ClassNotFoundException("class not found");
    }

    @RequestMapping("/nullpointer")
    public ModelAndView nullpointer(ModelAndView view) {
        view.setViewName("index");
        String str = null;
        str.length();
        return view;
    }  
            
    @ExceptionHandler(RuntimeException.class)
    public ModelAndView error(RuntimeException error, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.setViewName("error");
        mav.addObject("param", "Runtime error");
        return mav;
    }  
            
    @ExceptionHandler()
    public ModelAndView error(Exception error, HttpServletRequest request, HttpServletResponse response) {
        ModelAndView mav = new ModelAndView();
        mav.setViewName("error");
        mav.addObject("param", "Exception error");
        return mav;
    }  
    
    /** 
    @ExceptionHandler(NullPointerException.class)
    public ModelAndView error(ModelAndView mav) {
        mav.setViewName("error");
    mav.addObject("param", "NullPointer error");
        return mav;
    }*/
  
}

分析一下:

如果用户进入nullpointer方法,str对象还未初始化,会发生NullPointerException。如果去掉最后1个注释掉的error方法,那么会报错。因为ExceptionHandlerExceptionResolver的默认HandlerMethodArgumentResolver中只有ServletRequestMethodArgumentResolver和ServletResponseMethodArgumentResolver(所以其他2个error方法中的request和response参数没问题)。 所以我们给最后1个error方法加了注释。

由于TestErrorController控制器中有2个带有@ExceptionHandler注解的方法,之前分析的ExceptionHandlerMethodResolver构造过程中,会构造ExceptionHandlerMethodResolver,ExceptionHandlerMethodResolver内部会有1个key分别为RuntimeException和Exception,value分别为第一个和第二个error方法的缓存。由于NullPointerException的继承关系离RuntimeException比Exception近,因此最终进入了第一个error方法。

如果用户进入exception方法,同理。ClassNotFoundException继承自Exception,跟RuntimeException没关系,那么进入第二个error方法。

说明一下,两个error方法返回值都是ModelAndView,这是因为ExceptionHandlerMethodResolver的默认HandlerMethodReturnValueHandler中有ModelAndViewMethodReturnValueHandler。还有其他的比如ModelMethodProcessor、ViewMethodReturnValueHandler和ViewNameMethodReturnValueHandler等。这3个分别代表返回值Model,View和字符串。 有兴趣的读者可自行查看源码。 

 

上个例子是基于Controller的@ExceptionHandler注解方法,每个Controller都需要写@ExceptionHandler注解方法(写个BaseController可不用每个Controller都写单独的@ExceptionHandler注解方法)。

ExceptionHandlerMethodResolver内部找不到Controller的@ExceptionHandler注解的话,会找@ControllerAdvice中的@ExceptionHandler注解方法。

因此,我们也可以写1个ControllerAdvice。

@ControllerAdvice
public class ExceptionControllerAdvice {
  
    @ExceptionHandler(Throwable.class)
    @ResponseBody
    public Map<String, Object> ajaxError(Throwable error, HttpServletRequest request, HttpServletResponse response) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("error", error.getMessage());
        map.put("result", "error");
        return map;
    }
  
}

此类中的error方法代表着全局异常处理方法。

该方法可对ajax操作进行异常处理,我们返回值使用了@ResponseBody进行了处理,然后配置json消息转换器即可,这样该方法响应给客户端的数据就变成了json数据。 这方面的知识请参考:SpringMVC关于json、xml自动转换的原理研究

2. ResponseStatusExceptionResolver

先定义1个自定义异常:

@ResponseStatus(HttpStatus.UNAUTHORIZED)
public class UnauthorizedException extends RuntimeException {

}

Controller代码:

@Controller
@RequestMapping(value = "/error")
public class TestErrorController {
  
    @RequestMapping("/unauth")
    public ModelAndView unauth(ModelAndView view) {
        view.setViewName("index");
        throw new UnauthorizedException();
    }
  
}

由于该类没有写@ExceptionHandler注解,因此ExceptionHandlerExceptionResolver不能解析unauth触发的异常。接下来由ResponseStatusExceptionResolver进行解析,由于触发的异常UnauthorizedException带有@ResponseStatus注解。因此会被ResponseStatusExceptionResolver解析到。最后响应HttpStatus.UNAUTHORIZED代码给客户端。HttpStatus.UNAUTHORIZED代表响应码401,无权限。 关于其他的响应码请参考HttpStatus枚举类型源码。

3. DefaultHandlerExceptionResolver

直接上代码:

@Controller
@RequestMapping(value = "/error")
public class TestErrorController {
  
    @RequestMapping("/noHandleMethod")
    public ModelAndView noHandleMethod(ModelAndView view, HttpServletRequest request) throws NoSuchRequestHandlingMethodException {
        view.setViewName("index");
        throw new NoSuchRequestHandlingMethodException(request);
    }
  
}

用户进入noHandleMethod方法触发NoSuchRequestHandlingMethodException异常,由于没配置@ExceptionHandler以及该异常没有@ResponseStatus注解,最终由DefaultHandlerExceptionResolver解析,由于NoSuchRequestHandlingMethodException属于DefaultHandlerExceptionResolver解析的异常,因此被DefaultHandlerExceptionResolver解析。NoSuchRequestHandlingMethodException会发生404错误。

关于DefaultHandlerExceptionResolver可以处理的其他异常,请参考DefaultHandlerExceptionResolver源码。

扩展ExceptionHandlerExceptionResolver功能

SpringMVC提供的HandlerExceptionResolver基本上都能满足我们的开发要求,因此本文就不准备写自定义的HandlerExceptionResolver。

既然不写自定义的HandlerExceptionResolver,我们就来扩展ExceptionHandlerExceptionResolver来吧,让它支持更多的功能。

比如为ExceptionHandlerExceptionResolver添加更多的HandlerMethodArgumentResolver,ExceptionHandlerExceptionResolver默认只能有2个HandlerMethodArgumentResolver和ServletRequestMethodArgumentResolver(处理ServletRequest、WebRequest、MultipartRequest、HttpSession等参数)和ServletResponseMethodArgumentResolver(处理ServletResponse、OutputStream或Writer参数)。

  ModelAndView这种类型的参数会被ServletModelAttributeMethodProcessor处理。因此我们需要给ExceptionHandlerExceptionResolver添加ServletModelAttributeMethodProcessor这个HandlerMethodArgumentResolver。由于ServletModelAttributeMethodProcessor处理ModelAndView参数会使用WebDataBinderFactory参数,因此我们得重写doResolveHandlerMethodException方法,所以新写了1个类继承ExceptionHandlerExceptionResolver。

public class MyExceptionHandlerExceptionResolver extends ExceptionHandlerExceptionResolver{

    public MyExceptionHandlerExceptionResolver() {
        List<HandlerMethodArgumentResolver> list = new ArrayList<HandlerMethodArgumentResolver>();
        list.add(new ServletModelAttributeMethodProcessor(true));
        this.setCustomArgumentResolvers(list);
    }
  
    @Override
    protected ModelAndView doResolveHandlerMethodException(HttpServletRequest request,
                                                           HttpServletResponse response, HandlerMethod handlerMethod, Exception exception) {
        ServletInvocableHandlerMethod exceptionHandlerMethod = getExceptionHandlerMethod(handlerMethod, exception);
        if (exceptionHandlerMethod == null) {
            return null;
        }

        //ServletModelAttributeMethodProcessor 内部会使用传递进来的WebDataBinderFactory参数,该参数由ServletInvocableHandlerMethod提供
        exceptionHandlerMethod.setDataBinderFactory(new ServletRequestDataBinderFactory(null, null));

        exceptionHandlerMethod.setHandlerMethodArgumentResolvers(getArgumentResolvers());
        exceptionHandlerMethod.setHandlerMethodReturnValueHandlers(getReturnValueHandlers());

        ServletWebRequest webRequest = new ServletWebRequest(request, response);
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();

        try {
            if (logger.isDebugEnabled()) {
                logger.debug("Invoking @ExceptionHandler method: " + exceptionHandlerMethod);
            }
            exceptionHandlerMethod.invokeAndHandle(webRequest, mavContainer, exception);
        }
        catch (Exception invocationEx) {
            logger.error("Failed to invoke @ExceptionHandler method: " + exceptionHandlerMethod, invocationEx);
            return null;
        }

        if (mavContainer.isRequestHandled()) {
            return new ModelAndView();
        }
        else {
            ModelAndView mav = new ModelAndView().addAllObjects(mavContainer.getModel());
            mav.setViewName(mavContainer.getViewName());
            if (!mavContainer.isViewReference()) {
                mav.setView((View) mavContainer.getView());
            }
            return mav;
        }
    }
  
}

配置:

<bean class="org.format.demo.support.exceptionResolver.MyExceptionHandlerExceptionResolver">
  <property name="order" value="-1"/>
</bean>

配置完成之后,然后去掉本文实例讲解中ExceptionHandlerExceptionResolver的代码,并去掉支持NullPointerException异常的那个方法的注释。

测试如下:

 

 

读者可根据需求自己实现其他的扩展功能。 或者实现HandlerExceptionResolver接口新写1个HandlerExceptionResolver实现类。

新的的HandlerExceptionResolver实现类只需在配置文件中定义即可,然后配置优先级。DispatcherServlet初始化HandlerExceptionResolver的时候会自动寻找容器中实现了HandlerExceptionResolver接口的类,然后添加进来。

总结

分析了SpringMVC的异常处理机制并介绍了几个重要的接口和类,并分析了在<annotation-driven/>中定义的3个常用的HandlerExceptionResolver。

之后又编写了1个继承自ExceptionHandlerExceptionResolver类的异常解析类,巩固了之前分析的知识。

希望这篇文章能帮助读者了解SpringMVC异常机制。

 

文中难免有错误,希望读者能够指明出来。

参考资料

http://docs.spring.io/spring/docs/4.0.5.RELEASE/spring-framework-reference/htmlsingle/#mvc-exceptionhandlers

AOA(Angle of Arrival,到达角)定位算法及其误差分析的原理和MATLAB仿真_aoa定位算法 如图所示,有基站 S 1 ( x 1 , y 1 , z 1 ) , S 2 ( x 2 , y 2 , z 2 ) S_1(x_1,y_1,z_1),S_2(x_2,y_2,z_2) S1​(x1​,y1​,z1​),S2​(x2​,y2​,z2​),目标 T ( x , y , z ) T(x,y,z) T(x,y,z)。2+(z_1-z_2)^2} step1:两基站间的距离L=(x1−x2)2+(y1​−y2​)2+(z1​−z2​)2。 阅读详情

相关推荐

微信聊天记录解密,必须是root的手机

手机上安装x-plore软件,将/data/data目录的相关EnMicroMsg.db auth_info_key_prefs.xml拷贝到/storge/emulated/0目录后才可以拷贝到电脑。路径:/data/data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml。但是是加密过的 需要解密 解密密码生成规则是手机IMEI+微信UIN md5(32位小写)后的前7位。安卓手机要root测试版本微信要7或者8版本都可以。选择message表。

venus60的专栏 1004

SpringMVC源码---HandlerExceptionResolver

HandlerExceptionResolver用于解析请求过程中所产生的异常,继承结构图: 简介:     HandlerExceptionResolver主要实现都继承与抽象类的AbstractHandlerExecutionResolver,它有五个子类,其中AnnotationMethodHandlerExceptionResolver已经被弃用。剩余的 AbstractHand...

Visonws的博客 1842

保姆级避坑指南:在Ubuntu 22.04上成功复现VMamba模型(附完整环境依赖清单)

本文提供了在Ubuntu 22.04上复现VMamba模型的详细指南,包括环境准备、CUDA与PyTorch的精确匹配、依赖安装的疑难杂症解决以及完整环境清单。特别针对Linux系统下的环境复现问题,提供了实用的避坑技巧和验证方法,帮助开发者高效完成VMamba模型的部署。

weixin_29083373的博客 262

Spring Boot全局异常处理器(原理及使用详解)

软件开发springboot项目过程中,不可避免的需要处理各种异常,spring mvc架构中各层会出现大量的try{…} catch{…} finally{…}代码块,不仅有大量的冗余代码,而且还影响代码的可读性。这样就需要定义个全局统一异常处理器,以便业务层再也不必处理异常。Spring在3.2版本增加了一个注解@,可以与@ExceptionHandler、@InitBinder、@ModelAtribute等注解配套使用。

weixin_45131680的博客 4923

TensorRT-LLM.V1.1.0rc0:在无 GitHub 访问权限的服务器上编译 TensorRT-LLM 的完整实践

1.NGC上的预构建发布容器进行部署,见《2.通过pip进行部署。3.从源头构建再部署。在实际开发中,我们常常面临这样的场景:本地笔记本为 Windows 系统,虽然可以访问 GitHub,但受限于硬件性能,编译大型项目(如 TensorRT-LLM)耗时过长;而公司或实验室提供的 Linux 服务器性能强劲,适合编译任务,但却因网络策略限制无法连接外网,尤其是无法访问 GitHub。。

xinvictory的专栏 1202

智能优化算法-北方苍鹰优化算法(NGO)(附源码)

北方苍鹰优化算法 (Northern Goshawk Optimizer, NGO) 是一种基于群体智能的元启发式优化算法,它模拟了北方苍鹰(Northern Goshawk)的捕食行为、领地行为以及社交互动,用于解决复杂的优化问题。总之,NGO作为一种新颖的优化算法,在处理复杂优化问题方面展现出了潜力。随着进一步的研究和应用,NGO有望成为解决实际问题的有效工具。

w971656545的博客 1360

深入理解Spring异常处理

1.前言 相信我们每个人在Spring MVC开发中,都遇到这样的问题:当我们的代码正常运行时,返回的数据是我们预期格式,比如json或xml形式,但是一旦出现了异常(比如:NPE或者数组越界等等),返回的内容确实服务端的异常堆栈信息,从而导致返回的数据不能使客户端正常解析;很显然,这些并不是我们希望的结果。 我们知道,一个较为常见的系统...

weixin_34384915的博客 256

《MySQL高级篇》十四、多版本并发控制

《MySQL高级篇》十四、多版本并发控制

LXYDSF的博客 3991

SpringMVC源码分析之——处理请求核心流程之视图解析及全局异常处理

1.视图渲染 前面讲到在返回值解析的时候,返回返回值并没有@ResponseBody注解修饰,那么代表的是一个视图的名称,存放在ModelAndView对象中,由springmvc进行转发 接下来看看源码是怎么响应视图的 创建了一个View对象,从之前配置的页面前缀+视图名称+配置的后缀组成一个完成的地址 把响应数据设置到request对象中 最后用Servlet中的RequestDispatcher进行转发 2.全局异常处理 在项目中,后台处理请求之后返回的数据都会.

meser88的博客 691

全国大学校园网—拓扑图欣赏

全国大学网络拓扑图(一百张) 典型十张 1、 中央财经大学 2、国防科技大学 3、济南大学 4、西安石油大学 5、南通大学IPV6网络 6、中国矿业大学 7、青海师范大学 8、内蒙古科技大学 9、三峡大学 10、中共江苏省党校 剩余90张 点赞、评论获取 ...

LiBai'S BLOG 5万+

基于深度学习的人脸识别考勤管理系统,采用YOLOv11和Dlib算法实现人脸识别和考勤签到,前台人脸识别和签到系统 + 后台人脸和考勤管理系统,全网独发

基于深度学习的口罩人脸识别的考勤管理系统,采用YOLOv11和Dlib算法实现人脸识别和考勤签到,前台人脸识别和签到系统 + 后台人脸和考勤管理系统,全网独发

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1823

Springmvc 异常处理

图文详解,亲测有效

fishgeneral的博客 522

构建企业级AI税务顾问:优化税收策略与合规

本文深入探讨了构建企业级AI税务顾问的重要性及其在实际应用中的价值。通过分析当前税务领域的挑战和问题,本文详细介绍了AI税务顾问的基本原理、技术架构、核心功能以及实践应用。文章以逐步分析的方式,从背景介绍、核心概念与联系、算法原理讲解、系统分析与架构设计、项目实战到最佳实践与展望,系统性地展示了如何利用AI技术优化税收策略并确保税务合规。文章旨在为企业和税务从业者提供实用的指导,推动AI在税务领域的创新与发展。在当前全球经济一体化的背景下,企业面临着越来越复杂的税务环境。首先,税收法规的复杂性日益增加。

AI天才研究院 1153

springMVC原理(五):SpringMVC异常处理机制详解[附带源码分析]

重要接口和类介绍 1. HandlerExceptionResolver接口    SpringMVC异常处理核心接口。该接口定义了1个解析异常的方法: ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Excepti

mll999888的专栏 5986

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SpringMVC源码分析之异常处理机制

本篇博文从ExceptionResolver接口出发,介绍了其springMVC整个异常处理的UML类图结构,并对其相关子类进行详尽的分析、应用进行讲解,所有的子类源码分析都使用了例子和源码分析结合的方法进行阐述异常,读者可以通过这篇文章较好的了解springMVC异常处理机制以及应用场景。希望可以帮到大家

liushangzaibeijing的博客 6万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SpringMVC框架中的异常处理机制

SpringMVC框架的异常处理,异常处理,

weixin_44362089的博客 4309

SpringMVC 的三种异常处理方式详解

异常处理在开发中的重要性不言而喻。通过全局异常处理,可以提高系统的可维护性、容错性和安全性,改善用户体验,方便系统监控和问题排查。在Spring MVC中,合理分类和处理应用程序异常和系统异常,使用自定义异常类和全局异常处理器,可以实现精细化的异常处理。配置SimpleMappingExceptionResolver处理器和实现HandlerExceptionResolver接口是常见的实现方式。此外,响应封装类的使用可以统一响应数据格式,简化客户端处理逻辑,提供异常处理和多语言支持,增强应用程序的可维护性

让优秀成为一种习惯! 3624

详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析]

https://www.cnblogs.com/fangjian0423/p/springMVC-request-param-analysis.html 目录 前言 现象 源码分析 编写自定义的HandlerMethodArgumentResolver 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一。 如果有同学对它不熟悉,那么请参考它的入门blo...

z69183787的专栏 5122

SpringMVC详解

SpringMVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分。简化开发,减少出错,方便组内开发人员之间的配合。 他通过一套注解,让一个简单的Java类成为处理请求的控制器,而无需实现任何接口。同时它还支持Restful编程风格的请求。

互联网底层民工的博客 1万+

SpringMVC异常处理机制

SpringMVC作为一个优秀的Web层开发框架,在框架中已经集成了异常处理机制,可以帮我们我们灵活地处理程序中发生的异常,提高了我们程序的稳定性,令我们对程序运行中发生的异常更加可以控制,今天我们讲的就是SpringMVC框架中的对于异常的处理机制。

千里之行,始于足下 849

SpringMVC之JSON数据返回及异常处理机制

在异常处理过程中,当发生异常时,SpringMVC会自动寻找匹配的异常处理方法进行处理。首先会寻找当前Controller类中标注的@ExceptionHandler注解方法,如果找不到,则会寻找全局异常处理器中匹配的方法。然后,根据处理方法的返回值,进行适当的处理,例如返回错误页面视图或JSON格式的错误信息。 在SpringMVC中,JSON数据返回通常是通过使用`@ResponseBody`注解将Java对象转换为JSON格式,并直接发送给客户端。

SAME_LOVE的博客 2059

SpringMVC异常处理机制源码解析与自定义错误策略

在Web应用开发中,异常处理是确保系统鲁棒性和提供友好用户体验的关键环节。Spring MVC作为一个成熟的Web框架,提供了一套强大而灵活的异常处理机制。本文将深入Spring MVC源码,解析其异常处理的工作流程,并手把手教你如何定制符合业务需求的高效错误处理策略,其中会涉及Spring 6/Spring Boot 3的一些最新实践。将异常处理逻辑与业务逻辑分离开。开发者无需在Controller中编写大量的try-catch。

qwe147362的博客 1608

SpringMVC异常处理机制详解

重要接口和类介绍 1. HandlerExceptionResolver接口    SpringMVC异常处理核心接口。该接口定义了1个解析异常的方法: ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex...

qq_37211608的博客 186

SpringMVC父子容器源码分析

作为中央调度器,它根据配置将请求分发给相应的控制器,处理请求的解析、控制器的执行以及视图的渲染,起到了统一调度和管理的作用,是Spring MVC应用程序的核心组件。这个就得看一个关键的注解。(子容器只有Controller的bean,所以需要和父容器绑定),容器加载完毕就会发布一个加载完毕的事件,这时候就可以调用前面说的的监听器事件了。这里判断容器是否为空,我们前面知道,在使用Tomcat SPI创建容器的时候,创建的容器是不可能为空的,这句代码的意义就是,我们没有使用SPI,而是使用传统的使用。

qq_43456605的博客 1226
上一篇: SpringMVC视图机制详解[附带源码分析]
下一篇: Spring中Ordered接口简介
god_love_hlq_xff
博客等级 码龄11年 27粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值