日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring Boot統一返回體的踩坑記錄

瀏覽:228日期:2023-03-12 10:25:58
前言

在Spring Boot項目中我們可以通過RestControllerAdvice配合實現ResponseBodyAdvice<T>接口來保證Spring MVC接口具有統一的返回格式,以保證前端同學能夠封裝統一的數據接收工具。但是很多網上的文章并沒有對實際開發中的細節作出更多的講解。今天胖哥就來分享一下我的采坑經歷,也算作一個總結。

控制作用范圍

我記得在前面關于Swagger3的文章中提過,如果我們不指定范圍將導致Swagger無法識別接口的元信息。因此如果你使用了Swagger必須指定其范圍,這里你可以通過指定掃描包來指定其作用域:

@RestControllerAdvice('cn.felord.controller')

如果你的Spring MVC控制器有統一的父類控制器的話,

@RestController@RequestMapping('/foo')public class FooController extends BaseController { //todo 省略}

也可以這樣:

@RestControllerAdvice(assignableTypes = BaseController.class)白名單

有些接口可能根據業務需要或者協議需要不能使用統一返回體,例如支付的通知應答。這就需要一個類似白名單的機制來繞過統一返回體控制器通知類。我們可以借助于ResponseBodyAdvice<T>的下列方法實現:

boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType);

這個方法如果返回false就表示不執行統一返回體的封裝邏輯。這里我推薦注解實現。定義一個標記注解,可以定義在類上或者方法上:

@Documented@Inherited@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface IgnoreRestBody {}

然后上面的supports方法這樣實現:

@Overridepublic boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { return !returnType.hasMethodAnnotation(IgnoreRestBody.class);}

如果某個Controller下所有的方法都繞過,就把這個注解標記在控制器類上;如果只想忽略某個方法上就把它標記在該方法上即可。

返回獨立字符串的問題

有些接口我們會返回一個字符串:

@GetMapping('/get')public String getStr(){ //返回了一個字符串 return 'felord.cn';}

我們希望這個字符串被統一返回體處理,類似這樣:

{ code: 200, data: 'felord.cn', msg: '返回成字符串',}

但是你會發現并沒有達到期望的效果,會拋出類型轉換異常。這是因為當我們的Spring MVC接口返回數據時,會根據Content-Type來選擇一個HttpMessageConverter來處理,而字符串在不聲明Content-Type的情況下優先使用StringHttpMessageConverter ,就導致了轉換異常,需要設定成MappingJackson2HttpMessageConverter用Jackson來處理,Spring MVC的對應配置如下:

@Configuration(proxyBeanMethods = false)public class SpringMvcConfiguration implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {// 解決 String 統一封裝RestBody的問題converters.add(0, new MappingJackson2HttpMessageConverter()); }}

嗯,這樣就起效了!你以為這樣就完了?你會發現你的JSON序列化不按照你設置的策略執行了。因為你new了一個而不是采用系統初始化的那個。解決方法為,將Spring IoC中的ObjectMapper注入到MappingJackson2HttpMessageConverter中去。或者你使用Debug調試出系統默認的MappingJackson2HttpMessageConverter的位置,比如我的索引為7,就可以這樣配置:

@Configuration(proxyBeanMethods = false)public class SpringMvcConfiguration implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {// 解決 String 統一封裝RestBody的問題HttpMessageConverter<?> httpMessageConverter = converters.get(7);if (!(httpMessageConverter instanceof MappingJackson2HttpMessageConverter)) { // 確保正確,如果有改動就重新debug throw new RuntimeException('MappingJackson2HttpMessageConverter is not here');}converters.add(0, httpMessageConverter); }}Data的類型問題

曾經一個安卓開發同學說,你這統一結構中的data如果是數組:

{ code: 200, data: [’a’,’b’], msg: '返回成字符串',}

后續如果data添加其它與數組沒有關系的屬性就不兼容了,你應該保證這個data是個Map。是的,這也是問題,實際中發現不僅僅是數組,如果是int、long等原始類型或者String類型都面臨這種情況,需要加一個額外的判斷body是不是可能改變data類型的類型:

private boolean checkPrimitive(Object body) { Class<?> clazz = body.getClass(); return clazz.isPrimitive() || clazz.isArray() || Collection.class.isAssignableFrom(clazz) || body instanceof Number || body instanceof Boolean || body instanceof Character || body instanceof String;}

然后我們在ResponseBodyAdvice<T>實現中增加一個判斷:

// 增強擴展性if (checkPrimitive(body)) { return RestBody.okData(Collections.singletonMap('result', body));}

就解決問題了。

總結

今天對Spring Boot中統一返回體的一些細節問題進行了分享,希望能夠幫助你解決一些實際開發中遇到的同樣問題。

到此這篇關于Spring Boot統一返回體踩坑記錄的文章就介紹到這了,更多相關Spring Boot統一返回體內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产极品一区| 欧美日韩一二三四| 国产亚洲欧美日韩精品一区二区三区 | 国产精品蜜月aⅴ在线| 免费看久久久| 国产精品久久久久77777丨 | 国产高清亚洲| 欧美aa在线观看| 一级欧洲+日本+国产| 国产伦精品一区二区三区千人斩| 亚洲一区二区日韩| 在线亚洲观看| 久久精品一区二区三区中文字幕| 欧美日韩99| 午夜国产精品视频| 亚洲人成高清| 国产精品一区免费在线| 日韩高清一级| 国产成人调教视频在线观看| 伊人久久亚洲| 一本一道久久a久久| 鲁大师精品99久久久| 日韩中文字幕一区二区高清99| 日韩精品视频中文字幕| 电影天堂国产精品| 1000部精品久久久久久久久| 91麻豆精品激情在线观看最新| 国产一区二区三区不卡av| 激情综合网址| 国产高清日韩| 中文字幕免费精品| 91偷拍一区二区三区精品| 国产精品视频3p| 91免费精品国偷自产在线在线| 国产精品99久久免费| 日产午夜精品一线二线三线| 国产精品扒开腿做爽爽爽软件| 精品女同一区二区三区在线观看| 亚洲成人国产| 日韩美女精品| 国产一区二区三区四区五区传媒| 欧美一级精品| 欧美午夜三级| 亚洲成人va| 日韩中文av| 成人综合一区| 天堂av在线一区| 国产视频一区二| 久久久一二三| 在线亚洲成人| 国产精品v日韩精品v欧美精品网站| 欧美日韩国产高清电影| 国产精区一区二区| 亚洲免费成人av在线| 国产精品国产三级在线观看| 欧美sss在线视频| 日韩福利在线观看| 91精品国产调教在线观看| 五月激激激综合网色播| 久久久久久网| 日韩激情网站| 欧美.日韩.国产.一区.二区 | 日韩电影在线视频| 蜜桃久久av| 欧美日本不卡| 日韩精品午夜| 亚洲在线成人| 蜜芽一区二区三区| 一区二区三区午夜视频| 久久国产尿小便嘘嘘| 久久国产精品色av免费看| 97se综合| 日韩avvvv在线播放| 天堂а√在线最新版中文在线| 亚洲激情二区| 亚洲日本久久| av资源中文在线| 一区二区电影| 亚洲黑丝一区二区| 99热免费精品| 久久久久久亚洲精品美女| 精品一区二区三区亚洲| 麻豆国产一区| 日本亚洲不卡| 免费高清在线一区| 日韩成人亚洲| 欧美国产中文高清| 91精品国产自产观看在线| 欧美在线观看天堂一区二区三区| 不卡中文一二三区| 三级欧美韩日大片在线看| 伊人成人网在线看| 国产色99精品9i| 视频一区免费在线观看| 欧美一区精品| 日韩国产综合| 91一区二区三区四区| 日本视频中文字幕一区二区三区| 国产精品二区不卡| 久久伊人久久| 你懂的网址国产 欧美| 青青草伊人久久| 日本v片在线高清不卡在线观看| 免费成人在线影院| 综合激情网...| 亚洲综合福利| 国产精品呻吟| 99在线精品视频在线观看| 三上悠亚国产精品一区二区三区| 国产极品模特精品一二| 国产精品白丝一区二区三区| 亚洲人成毛片在线播放女女| 国产精品av一区二区| 色爱av综合网| 欧美成人亚洲| 久久福利毛片| 久久精品xxxxx| 精品黄色一级片| 日韩成人免费| 99久久99久久精品国产片果冰| 日韩精品免费一区二区三区| 欧美不卡在线| 亚洲精品九九| 国产欧美日韩精品高清二区综合区 | 国产女优一区| 亚洲影视一区| 久久精品国产99国产| 午夜欧美巨大性欧美巨大| 欧美在线亚洲| 欧美日韩在线精品一区二区三区激情综合 | 日韩av一区二区三区| 久久这里只有精品一区二区| 日本少妇一区| 天堂va欧美ⅴa亚洲va一国产| 欧美aa在线视频| 中文在线不卡| 久久久久观看| 日韩在线视频精品| 神马久久午夜| 伊伊综合在线| 91日韩欧美| 亚洲五月婷婷| 天堂日韩电影| 亚洲一区日韩在线| 亚洲理论在线| 国产日韩欧美一区在线| 欧美aa在线视频| 日本在线高清| 好看的亚洲午夜视频在线| 一区二区三区四区日韩| 久久国内精品自在自线400部| 久久av电影| 久久青草久久| 亚洲久久在线| 久久永久免费| 久久免费大视频| 亚洲精品日韩久久| 日韩精品导航| 91亚洲国产高清| 国产亚洲高清视频| 日韩极品在线观看| 日韩综合在线| 丝袜脚交一区二区| 欧美激情视频一区二区三区在线播放| 国产精品久久久久久久免费观看| 激情久久久久久| 亚洲人成网77777色在线播放| 国产高清精品二区| 亚洲黑丝一区二区| 欧美日韩1区| 激情国产在线| 日韩精品一级中文字幕精品视频免费观看 | 亚洲精品日本| 精品久久久久中文字幕小说| 99久久亚洲精品蜜臀| 日韩1区2区3区| 中文字幕成在线观看| 日韩中文欧美在线| 精品一区视频| 亚洲欧美日韩国产| 国产精品手机在线播放| 久久蜜桃av| 欧美激情一区| 蜜臀久久99精品久久久久宅男| 久久精品一区二区三区中文字幕| 日韩一级精品| 美女在线视频一区| 欧美综合二区| av中文字幕在线观看第一页| 亚洲精品自拍| 成人看片网站| 国产精品一区二区精品| 午夜国产精品视频免费体验区| 国产精品一区二区精品| 欧美特黄视频| 欧美激情一区| 亚洲欧美一级| 狠狠色综合网| 精品视频97| 欧美偷窥清纯综合图区|