发生异常时,从ExceptionHandler中获取Body参数进行分析

Spring Cloud Gateway过滤器精确控制异常返回(实战,完全定制返回body) 虽然面试套路众多,但对于技术面试来说,主要还是考察一个人的技术能力和沟通能力。不同类型的面试官根据自身的理解问的问题也不尽相同,没有规律可循。上面提到的关于这些JAVA基础、三大框架、项目经验、并发编程、JVM及调优、网络、设计模式、spring+mybatis源码解读、Mysql调优、分布式监控、消息队列、分布式存储等等面试题笔记及资料。 阅读详情

用SpringMVC时,使用ExceptionHandler去做Controller层的统一异常处理。
使用ExceptionHandler注解的异常处理方法可以使用很灵活的方法签名。

如何在异常发生时输出请求

发生异常时,不仅仅需要输出异常本身,经常还需要根据Request的具体内容来分析、排查问题。
比如HttpRequestMethodNotSupportedException、HttpMessageConversionException等等,这些异常发生在业务代码处理之前,业务代码是无法获取到request的数据的,发生异常时如果能够看到请求body的具体内容,那么处理起来就可以对症下药,事半功倍。
说起来简单,做起来却不是很顺当,虽然ExcelptionHandler中可以传入ServerletRequest作为入参,但是ServerletRequest的inputStream只能被读取一次,发生异常的时候再想去读取body只能悲催的得到一个已经Closed的Stream。

使用ContentCachingRequestWrapper

1,通过过滤器将ServerletRequest封装成ContentCachingRequestWrapper,body被读取后,会被它缓存。

@Component
public class RequestWrapperFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
        filterChain.doFilter(new ContentCachingRequestWrapper(httpServletRequest), httpServletResponse);
    }
}

2,ExceptionHandler传入ServletRequest,此时的ServletRequest就是ContentCachingRequestWrapper,输出即可

    @ExceptionHandler(value = Exception.class)
    public ResponseEntity<Response> returnMediaTypeNotSupportError(Exception ex, ServletRequest request) {
        if (request != null && request instanceof ContentCachingRequestWrapper) {
            ContentCachingRequestWrapper wrapper = (ContentCachingRequestWrapper) request;
            logger.error("request_body:{}", StringUtils.toEncodedString(wrapper.getContentAsByteArray(), Charset.forName(wrapper.getCharacterEncoding())));
        }
    }
解锁新技能《springboot全局异常处理@ExceptionHandler如何获取控制器方法上的注解》 springboot全局异常处理通常都是用@RestControllerAdvice标注异常处理类,使用@ExceptionHandler标注在捕获具体异常的方法上,我们可以通过异常参数获取异常信息,那如果我想获取抛出异常的具体控制器及其上面标注的注解如何获取呢? 阅读详情

相关推荐

全局异常处理-@ExceptionHandler、ExceptionHandlerMethodResolver

*** 处理自定义的业务异常* @param e* @return*/logger.error("发生业务异常!原因是:{}",e.getErrorMsg());说明:@ControllerAdvice 表示处理全局异常,@ResponseBody 表示返回json格式,如果是@RestControllerAdvice 会自动转换json,则不需要加@ResponseBody,

墨鱼第二大脑 1127

Spring的@ExceptionHandler注解使用方法

目录 1,基本使用方法 2,注解的参数 3,就近原则 4,注解方法的返回值 5,错误的操作 1,基本使用方法 Spring的@ExceptionHandler可以用来统一处理方法抛出的异常,比如这样: @ExceptionHandler() public String handleExeption2(Exception ex) { System.out.println("...

lkforce 8万+

LabVIEW内存优化实战:用DVR和队列高效处理大型数组,告别数据副本

本文深入探讨LabVIEW内存优化技术,重点介绍数据值引用(DVR)和单元素队列(SEQs)在高效处理大型数组中的应用。通过对比传统方法与现代引用技术的性能差异,提供减少内存副本、提升程序效率的实战方案,帮助开发者在测试测量、图像处理等数据密集型场景中实现显著性能提升。

weixin_30835649的博客 1061

spring全局异常处理类ExceptionHandler获取request入参

项目中需要用到的数据校验、异常捕获,所以会用@ExceptionHandler方法,对Controller做统一的全局异常处理。当发生异常时,需要记录异常的url、入参、出参、错误信息等。但是request的inputStream已经读取过一次,此时拿到的request是空的。

1622

别再死磕Excel了!用Vensim PLE免费版,30分钟搞定你的第一个系统动力学模型

本文介绍如何使用Vensim PLE免费版在30分钟内构建第一个系统动力学模型,无需编程或数学基础。通过个人储蓄增长案例,详细讲解因果回路图绘制、存量流量图创建及方程编写,帮助读者掌握动态系统建模与仿真技巧,适用于理财、项目管理等多种场景。

weixin_29045001的博客 327

【3D目标检测】MMdetection3d——搭建IS-Fusion环境+nuScenes数据集训练

搭建IS-Fusion环境+nuScenes数据集训练

qq_44703886的博客 2322

SpringMVC ExceptionHandler原理与入参以及返回值

文章目录源码 & 原理入参与返回值 源码 & 原理 https://juejin.cn/post/6844903815859322893 Spring 入参与返回值 https://blog.youkuaiyun.com/j510924/article/details/51130853?ops_request_misc=%7B%22request%5Fid%22%3A%22163100093516780264072172%22%2C%22scm%22%3A%2220140713.130102334..%

weixin_38370441的博客 2325

GD32F303调试小记(一)之USART(接收中断、接收空闲中断+DMA、发送DMA)

前言 之前写了GD32F103调试小记(二)之USART(接收中断、接收空闲中断+DMA、发送DMA)一文。这次我们来看看GD32F303的USART是如何配置的,结合这两篇文章,相信大家GD32的USART配置流程会十分熟悉。 DMA 能大大减轻CPU负荷的东西,建议场景合适的情况下,都去用DMA功能。 USART 一种串行通信协议, ...

欢喜6666的博客 3万+

如何在Spring的ExceptionHandler中获取Body

目前是用SpringMVC时,往往使用ExceptionHandler去做Controller层的统一异常处理。 使用ExceptionHandler注解的异常处理方法可以使用很灵活的方法签名。 可使用的参数类型 一个异常参数。声明一个一般性的异常或者更加具体的异常 Request 和/或 response 对象(Servlet API 或 Portlet API)。可以选择一个特定 - request/response的类型,比如ServletRequest / HttpServletRequest

liuqinen的博客 825

使用buildroot系统的qmake编译QT出现Unknown module(s) in QT: xxxx 的错误解决方法

可以看到,我这里使用的是 qt5base-5.15.2 目录下的qmake,这个qmake只包含了基础的qt模块,而额外添加的qt模块没有包含进去,需要使用。可以看到我这里是有的,如果你跟我一样,模块存在,但是还是报找不到对应模块的错误的话,大概率是跟我一样,用错qmake了,看第二点。在包含 qt5base 目录下查看,是否有对应模块的目录,如果没有的话,需要通过make menuconfig 添加一下。目录下的qmake才可以。

T541132的博客 2489

CloudCompare 二次开发(41)——点云重建三维凸包并计算体积

本文介绍了如何结合PCL与CloudCompare实现点云三维凸包的构建与可视化。通过代码集成,在CloudCompare界面添加功能按钮,实现点云数据转换、凸包构建、体积计算以及可视化显示。具体步骤包括:1) 在UI中添加功能按钮;2) 将点云数据转换为PCL格式;3) 使用PCL的ConvexHull算法构建三维凸包;4) 计算并显示凸包体积;5) 将结果以点云和网格形式可视化显示。最终实现了点云凸包的自动构建与体积计算功能,为点云处理提供了实用工具。

点云侠的博客 191

【深入浅出Spring原理及实战】「技术原理」从源码角度去深入分析关于Spring的异常处理ExceptionHandler的实现原理

执行**@RequestMapping方法抛出异常后,Spring框架try-catch的方法捕获异常, 正常逻辑发不发生异常都会走processDispatchResult**流程 ,区别在于异常的参数是否为null .try {//根据请求查找handlerMapping找到controller mappedHandler = getHandler(request);

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。 4904

在Simulink中实现基于深度强化学习的控制算法仿真建模

通过上述步骤,你可以在Simulink中实现基于深度强化学习的控制算法仿真建模。这种方法适用于许多复杂的控制问题,尤其是当传统控制方法难以找到有效解决方案时。随着经验的积累,你可以进一步探索不同的深度强化学习算法及其变种,以适应更广泛的应用场景。此外,还可以结合其他先进技术(如迁移学习、多智能体协作等),提升模型的表现能力。

amy_mhd的博客 414

使用 ExceptionHandler 处理业务流程的异常情况

Problem 在业务实现过程中,我们可能会有类似如下的场景,要实现一个下单功能,除了下单正常执行的流程之外,我们还可能需要处理各种的业务异常情况,比如说下单的用户在服务端找不到,下单的商品在服务端找不到等等的业务异常情况(注意是业务异常),这时可能会有如下的伪代码,用户找不到时,给客户端响应 http status 为 500,http body 里的内容为一个 map 对象;如果是正常执行完毕...

来啊 快活啊 3036

Unity 热更新技术 | (二) AssetBundle - 完整系列教程学习

开始学习热更新方面系列知识,就从这一篇开始吧! 本系列教程 会从热更新基本概念出发,详细介绍热更新相关的全套知识点。 如热更新技术基本原理、热更新主流方案、AssetBundle系列教程、Lua语言编程、Lua与Unity交互教程、Xlua框架使用、热更新实战教程等方面。 热更新作为一个开发者必备技能,如果想学习的话,可以从现在开始了哦~ 接下来从 AssetBundle - 完整系列教程学习 开始学习吧!

努力前行,总会成为自己心中的那道光 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

如何在ExceptionHandler打印出body数据

如何在 ExceptionHandler 打印出Body数据

qq_27502511的博客 646

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ControllerAdvice + ExceptionHandler 全局处理 Controller 层异常

在传统的 Servlet 应用中,异常处理通常分散在各个 Servlet 或 JSP 中,难以维护。Spring MVC 通过集中处理请求分发,同时提供了一个可扩展的异常解析器()体系,用于处理控制器执行过程中抛出的异常。当控制器方法抛出异常时,会委托给已注册的实现类来解析并处理该异常,最终返回一个或直接写入响应。Spring 内置了多个:支持通过注解的方法处理异常。:根据注解将异常转换为 HTTP 状态码。:处理 Spring MVC 内置的标准异常,并转换为对应的 HTTP 状态码。而配合正是利用。

油墨香^-^的博客 550

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SpringBoot 解决request请求体只能被读一次的问题,在全局异常@RestControllerAdvice ExceptionHandler中打印参数

request.getInputStream()获取请求body里面的内容只能被获取一次,ContentCachingRequestWrapper通过这个类能够解决解决HttpServletRequest inputStream只能读取一次的问题,但是这个类有缺陷(前提必须是doFilter之前不能使用request.getInputStream()方法)全局异常捕获类中打印异常POST请求的参数。在全局异常捕获类中使用。

TOP丶Chen 1926

Spring Boot 请求处理链路:Filter → Interceptor → AOP → ExceptionHandler 执行顺序详解

Filter 是 Servlet 规范定义的组件,位于整个链路的最外层。职责:请求预处理、响应后处理、通用逻辑(如登录校验、日志记录、跨域处理)配置方式@WebFilter或作用范围:覆盖所有请求,包括静态资源@OverrideSystem.out.println("Filter 执行(请求前)");// 放行,执行后续链路System.out.println("Filter 执行(响应后)");异常抛出时的处理顺序:Controller 抛出异常↓。

圆师傅的博客 448

afterthrowing注解无法捕获异常_SpringBoot优雅处理全局异常

前言本篇文章主要介绍的是SpringBoot项目进行全局异常的处理。SpringBoot全局异常准备说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码。开发准备环境要求JDK:1.8SpringBoot:1.5.17.RELEASE首先还是Maven的相关依赖: UTF-8 1.8 1.8 1.8 ...

weixin_36060917的博客 3418

SpringBoot全局异常处理(最佳实践)

Controller抛出了异常,被异常处理器处理,返回的过程中,Filter又抛出了一个异常,被BasicExceptionController处理,但BasicExceptionController的到的异常信息却是Controller产生的异常信息,而不是Filter产生的异常信息。使用简单映射异常处理器处理异常,通过配置SimpleMappingExceptionResolver类也是进行近似全局异常处理,但该种方式不能得到具体的异常信息,且返回的是视图,不推荐使用。

LU58542226的博客 4602

【Spring】全局异常处理中,如何获取请求体内容?

SpringMVC项目中,将HttpServletRequest包装成ContentCachingRequestWrapper,可以实现对请求体内容的重复获取。这点在全局异常处理中很实用。

Season-0209的博客 2104

Spring全局异常处理的使用及源码分析

**} }是一个组合注解,由@ControllerAdvice和@ResponseBody组成,相同于**@RestController与之间的区别,增加@ResponseBody**注解则返回的结果直接写入 HTTP中,反之直接返回view。通过指定@RestControllerAdvice中的和的属性可以扫描指定包路径下或类的异常。/**/**} }

慢慢来~ 465

Spring boot 异常配置

文章目录Spring boot 异常配置上一节 Spring boot 参数校验源码下一节 Spring boot jdbcTemplate Spring boot 异常配置 上一节 Spring boot 参数校验 Spring boot 参数校验 源码 源码地址 下一节 Spring boot jdbcTemplate Spring boot jdbcTemplate ...

xiao/du的博客 567

SpringMVC 捕获参数绑定失败时的异常

SpringMVC配置数据验证(JSR-303)中提到了用String类型的域来绑定Ajax中的非法类型的参数。 这样做的目的是一旦发生一种情况,后端可以返回一个自定类的返回值,而不是返回SpringMVC参数绑定失败的错误信息。 但是,这样做并不OOP。 更好的方法是使用@ControllerAdvice和@ExceptionHandler标签来捕获参数绑定失败的异常,如下 ...

weixin_34387468的博客 579

SpringBoot的全局异常处理

前言 本篇文章主要介绍的是SpringBoot的全局异常处理。 GitHub源码链接位于文章底部。 首先还是来看工程的结构 在pom文件中添加相关依赖 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>...

qq_27682773的博客 679
上一篇: 使用seata解决分布式事物问题
下一篇: 通过aop切面记录controller请求与返回结果日志
hwmhehe
博客等级 码龄13年 86粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值