本篇内容介绍了“ResponseBodyAdvice如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ResponseBodyAdvice接口可以在将handler方法的返回值写入response前对返回值进行处理,例如将返回值封装成一个与客户端约定好的对象以便于客户端处理响应数据。SpringBoot版本:2.4.1假如已经存在一个Controller,如下所示。上述Controller中有两个方法,并且返回值分别为ResponseEntity@ControllerAdvice
注解修饰并实现ResponseBodyAdvice
接口的类所实现的beforeBodyWrite()
方法会在handler方法返回值写入response前被调用,并且handler方法返回值会作为入参传入beforeBodyWrite()
,从而可以在返回值写入response前对返回值进行一些定制操作,例如对返回值进行一层封装。首先说明一下为什么第一小节中DemoController的getDefaultDemo1() 方法的返回值类型为ResponseEntityRequestResponseBodyMethodProcessor#handleReturnValue
HttpEntityMethodProcessor#handleReturnValue()
现在正式开始对ResponseBodyAdvice的原理进行分析。已知所有ResponseBodyAdvice接口的调用是发生在AbstractMessageConverterMethodProcessor的writeWithMessageConverters() 方法中,其部分源码如下所示。AbstractMessageConverterMethodProcessor的getAdvice() 方法会返回其在构造函数中加载好的RequestResponseBodyAdviceChain对象,下面看一下RequestResponseBodyAdviceChain的beforeBodyWrite() 方法。在RequestResponseBodyAdviceChain中,beforeBodyWrite() 方法调用了processBody() 方法,processBody() 方法会遍历所有加载好并且适用于当前handler的ResponseBodyAdvice并执行,至此,所有由@ControllerAdvice注解修饰的ResponseBodyAdvice接口会在这里执行。小节:由@ControllerAdvice
注解修饰的ResponseBodyAdvice
接口会被SpringMVC框架加载到RequestResponseBodyMethodProcessor
和HttpEntityMethodProcessor
这两个返回值处理器中,当这两个返回值处理器将返回值写入response前,适用于当前handler的ResponseBodyAdvice
接口会被调用,从而可以完成对返回值的定制化改造。由第二小节可知,正是因为RequestResponseBodyMethodProcessor和HttpEntityMethodProcessor这两个返回值处理器会将由@ControllerAdvice注解修饰的ResponseBodyAdvice接口加载,才能够实现将返回值写入response前调用这些ResponseBodyAdvice接口对返回值进行一些操作。那么本小节将对esponseBodyAdvice接口的加载进行学习。首先给出结论:ResponseBodyAdvice
的加载发生在RequestMappingHandlerAdapter
的afterPropertiesSet()
方法中。已知,RequestMappingHandlerAdapter实现了InitializingBean接口,因此RequestMappingHandlerAdapter实现了afterPropertiesSet() 方法。该方法实现如下。上述实现中,initControllerAdviceCache() 方法会加载ControllerAdviceBean相关内容到RequestMappingHandlerAdapter中,这其中就包含由@ControllerAdvice注解修饰的ResponseBodyAdvice接口。然后在getDefaultReturnValueHandlers() 方法中会创建返回值处理器,在创建RequestResponseBodyMethodProcessor和HttpEntityMethodProcessor时会使用加载好的ResponseBodyAdvice接口完成这两个返回值处理器的初始化。上述两个方法的部分源码如下所示。initControllerAdviceCache()
getDefaultReturnValueHandlers()
根据getDefaultReturnValueHandlers() 方法可知,在创建HttpEntityMethodProcessor或者RequestResponseBodyMethodProcessor时,会将RequestMappingHandlerAdapter加载好的ResponseBodyAdvice传入构造函数,并且,无论是HttpEntityMethodProcessor还是RequestResponseBodyMethodProcessor,其构造函数最终都会调用到父类AbstractMessageConverterMethodArgumentResolver的构造函数,并在其中初始化一个RequestResponseBodyAdviceChain以完成ResponseBodyAdvice的加载。构造函数源码如下所示。HttpEntityMethodProcessor#HttpEntityMethodProcessor
AbstractMessageConverterMethodProcessor#AbstractMessageConverterMethodProcessor
AbstractMessageConverterMethodArgumentResolver#AbstractMessageConverterMethodArgumentResolver
小节:RequestMappingHandlerAdapter
会在其实现的afterPropertiesSet()
方法中加载由@ControllerAdvice
注解修饰的ResponseBodyAdvice
接口,然后会创建并加载返回值处理器,在创建R免费云主机域名equestResponseBodyMethodProcessor
和HttpEntityMethodProcessor
这两个返回值处理器时会传入加载好的ResponseBodyAdvice
,从而完成了ResponseBodyAdvice的加载。“ResponseBodyAdvice如何使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注百云主机网站,小编将为大家输出更多高质量的实用文章!
相关推荐: Qt音视频开发之音频播放QAudioOutput如何实现
这篇文章主要介绍了Qt音视频开发之音频播放QAudioOutput如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Qt音视频开发之音频播放QAudioOutput如何实现文章都会有所收获,下面我们一起来看看吧。以前一直以为只…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。