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

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Spring Boot統(tǒng)一返回體的踩坑記錄

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

在Spring Boot項(xiàng)目中我們可以通過RestControllerAdvice配合實(shí)現(xiàn)ResponseBodyAdvice<T>接口來保證Spring MVC接口具有統(tǒng)一的返回格式,以保證前端同學(xué)能夠封裝統(tǒng)一的數(shù)據(jù)接收工具。但是很多網(wǎng)上的文章并沒有對(duì)實(shí)際開發(fā)中的細(xì)節(jié)作出更多的講解。今天胖哥就來分享一下我的采坑經(jīng)歷,也算作一個(gè)總結(jié)。

控制作用范圍

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

@RestControllerAdvice('cn.felord.controller')

如果你的Spring MVC控制器有統(tǒng)一的父類控制器的話,

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

也可以這樣:

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

有些接口可能根據(jù)業(yè)務(wù)需要或者協(xié)議需要不能使用統(tǒng)一返回體,例如支付的通知應(yīng)答。這就需要一個(gè)類似白名單的機(jī)制來繞過統(tǒng)一返回體控制器通知類。我們可以借助于ResponseBodyAdvice<T>的下列方法實(shí)現(xiàn):

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

這個(gè)方法如果返回false就表示不執(zhí)行統(tǒng)一返回體的封裝邏輯。這里我推薦注解實(shí)現(xiàn)。定義一個(gè)標(biāo)記注解,可以定義在類上或者方法上:

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

然后上面的supports方法這樣實(shí)現(xiàn):

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

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

返回獨(dú)立字符串的問題

有些接口我們會(huì)返回一個(gè)字符串:

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

我們希望這個(gè)字符串被統(tǒng)一返回體處理,類似這樣:

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

但是你會(huì)發(fā)現(xiàn)并沒有達(dá)到期望的效果,會(huì)拋出類型轉(zhuǎn)換異常。這是因?yàn)楫?dāng)我們的Spring MVC接口返回?cái)?shù)據(jù)時(shí),會(huì)根據(jù)Content-Type來選擇一個(gè)HttpMessageConverter來處理,而字符串在不聲明Content-Type的情況下優(yōu)先使用StringHttpMessageConverter ,就導(dǎo)致了轉(zhuǎn)換異常,需要設(shè)定成MappingJackson2HttpMessageConverter用Jackson來處理,Spring MVC的對(duì)應(yīng)配置如下:

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

嗯,這樣就起效了!你以為這樣就完了?你會(huì)發(fā)現(xiàn)你的JSON序列化不按照你設(shè)置的策略執(zhí)行了。因?yàn)槟鉵ew了一個(gè)而不是采用系統(tǒng)初始化的那個(gè)。解決方法為,將Spring IoC中的ObjectMapper注入到MappingJackson2HttpMessageConverter中去。或者你使用Debug調(diào)試出系統(tǒng)默認(rèn)的MappingJackson2HttpMessageConverter的位置,比如我的索引為7,就可以這樣配置:

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

曾經(jīng)一個(gè)安卓開發(fā)同學(xué)說,你這統(tǒng)一結(jié)構(gòu)中的data如果是數(shù)組:

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

后續(xù)如果data添加其它與數(shù)組沒有關(guān)系的屬性就不兼容了,你應(yīng)該保證這個(gè)data是個(gè)Map。是的,這也是問題,實(shí)際中發(fā)現(xiàn)不僅僅是數(shù)組,如果是int、long等原始類型或者String類型都面臨這種情況,需要加一個(gè)額外的判斷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;}

然后我們?cè)赗esponseBodyAdvice<T>實(shí)現(xiàn)中增加一個(gè)判斷:

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

就解決問題了。

總結(jié)

今天對(duì)Spring Boot中統(tǒng)一返回體的一些細(xì)節(jié)問題進(jìn)行了分享,希望能夠幫助你解決一些實(shí)際開發(fā)中遇到的同樣問題。

到此這篇關(guān)于Spring Boot統(tǒng)一返回體踩坑記錄的文章就介紹到這了,更多相關(guān)Spring Boot統(tǒng)一返回體內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品**中文毛片| 另类专区亚洲| 999在线观看精品免费不卡网站| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 日韩av字幕| 久久国产精品美女| 国产精品调教| 精品国产亚洲日本| 日韩一区二区三区在线免费观看| 九一国产精品| 视频一区日韩精品| 国产欧美日韩影院| 91亚洲国产成人久久精品| 999久久久免费精品国产| 石原莉奈一区二区三区在线观看| 亚洲三级av| 精品国产乱码久久久| japanese国产精品| 国产区精品区| 亚洲国产一区二区三区在线播放| 免费在线成人网| 国产精品观看| 三级精品视频| 日韩高清二区| 亚洲爱爱视频| 欧美日一区二区在线观看| 欧洲精品一区二区三区| 亚洲制服欧美另类| 中文一区一区三区高中清不卡免费| av不卡在线看| 国产精品二区影院| 欧美午夜精彩| 国产日韩欧美| 91精品电影| 国产精品mv在线观看| 欧美精品一区二区三区精品| 亚洲主播在线| 久久精品资源| 蜜臀91精品一区二区三区| 日韩av自拍| 日本不卡一区二区| 999久久久免费精品国产| 国产欧美二区| 亚洲一区免费| 国产精品久久观看| 91亚洲精品在看在线观看高清| 欧美不卡视频| 捆绑调教美女网站视频一区| 久久不射网站| 九九精品调教| 欧美aⅴ一区二区三区视频| 欧美在线资源| 国产夫妻在线| 免费日韩一区二区三区| 免费观看在线色综合| 深夜视频一区二区| 麻豆精品视频在线观看| 天堂va欧美ⅴa亚洲va一国产| 色一区二区三区四区| 欧美一区网站| 亚洲一区有码| 亚洲少妇自拍| 国产一区日韩一区| se01亚洲视频 | 国语精品一区| 日韩国产精品久久久久久亚洲| 亚洲高清成人| 日韩精品2区| 精品一区二区三区中文字幕 | 老鸭窝一区二区久久精品| 首页国产欧美日韩丝袜| 亚洲免费福利| 成人污污视频| 麻豆91小视频| 国产日本久久| 国产精品一区二区三区美女| 亚洲免费毛片| 亚洲精品亚洲人成在线观看| 香蕉成人久久| 亚洲欧美日韩国产一区| 国产精品7m凸凹视频分类| 久久蜜桃精品| 少妇久久久久| 婷婷成人综合| 五月天综合网站| 国产综合视频| 激情久久婷婷| 好吊视频一区二区三区四区| 国产一区日韩一区| 亚洲高清影视| 免费日韩av片| 亚洲精品乱码久久久久久蜜桃麻豆| 久久99伊人| 午夜精品影视国产一区在线麻豆| 蜜桃久久久久久| 日韩在线观看中文字幕| 日韩精品一区二区三区av| 日韩av午夜在线观看| 国产精品www.| 国产精品久久久久久久久久10秀| 首页国产精品| 国产自产自拍视频在线观看| 日韩三区免费| 99免费精品| 亚洲欧美日韩精品一区二区 | 蜜桃一区二区三区在线| 日本中文字幕不卡| 国产三级精品三级在线观看国产| 国产精品日本一区二区不卡视频 | 麻豆精品视频在线观看免费| 精品视频国内| 欧美中文一区二区| 免费美女久久99| 国产精品亲子伦av一区二区三区| 韩国一区二区三区视频| 激情久久久久久久| 日韩精品一级中文字幕精品视频免费观看| 久久www成人_看片免费不卡| 日韩精品一区二区三区中文| 国产精品亚洲成在人线| 日韩大片在线| 国产一区二区精品| 国产调教一区二区三区| 国产在线看片免费视频在线观看| 久久久777| 亚洲九九精品| 9999国产精品| 日韩精品一级中文字幕精品视频免费观看| 日韩精品一页| 国产精品成人a在线观看| 99久久精品网站| 欧美一区成人| 91精品国产成人观看| 亚洲精品高潮| 中文在线资源| 日本在线视频一区二区| 日韩电影免费网址| 最新国产精品久久久| 国产激情在线播放| 香蕉久久夜色精品国产| 国产精品探花在线观看| 久久国产小视频| 青青在线精品| 不卡中文字幕| 久久精品欧洲| 日韩中文欧美在线| 亚洲黄色中文字幕| 日韩av黄色在线| 免费国产自久久久久三四区久久| 日本色综合中文字幕| 欧美一级精品| 麻豆一区二区在线| 免费人成精品欧美精品| 成人美女视频| 日韩高清电影免费| 国产综合激情| 福利一区视频| 国产精品一级在线观看| 午夜一区在线| 91精品久久久久久久久久不卡| 国产精品综合| 久久亚洲影院| 激情综合自拍| 91综合视频| 欧美黄色一区二区| 亚洲bt欧美bt精品777| 欧洲一级精品| 精品三级久久久| 国产精品资源| 蜜桃久久久久久| 婷婷综合社区| 久久精品国语| 日韩国产一区二区| 精品久久视频| 国产精品xxx在线观看| 亚洲精品视频一二三区| 国内精品99| 日韩国产一区| 国产精品二区不卡| 久久爱www.| 国产日韩免费| 日精品一区二区三区| 国产一区导航| 伊人精品在线| 欧美日韩高清| 久久中文字幕av| 日韩在线短视频| 国产成人在线中文字幕| 久久一区亚洲| 久久一区视频| 精品72久久久久中文字幕| 久久国产免费看| 日韩精品91亚洲二区在线观看| 老司机久久99久久精品播放免费| 伊人成人在线视频| 亚洲一区二区三区免费在线观看 | 国产96在线亚洲| 麻豆国产91在线播放| 国产精品hd| 国产成人免费精品|