电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:115日期: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
相關文章:
主站蜘蛛池模板: 有福网(yofus.com)洗照片冲印,毕业聚会纪念册相册制作个性DIY平台 | 营养师网,营养师考试时间,报名入口—网站首页 | 注塑模具_塑料模具_塑胶模具_范仕达【官网】_东莞模具设计与制造加工厂家 | 冷油器-冷油器换管改造-连云港灵动列管式冷油器生产厂家 | 安徽净化板_合肥岩棉板厂家_玻镁板厂家_安徽科艺美洁净科技有限公司 | 液晶拼接屏厂家_拼接屏品牌_拼接屏价格_监控大屏—北京维康 | pbootcms网站模板|织梦模板|网站源码|jquery建站特效-html5模板网 | 超高频感应加热设备_高频感应电源厂家_CCD视觉检测设备_振动盘视觉检测设备_深圳雨滴科技-深圳市雨滴科技有限公司 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 金属波纹补偿器厂家_不锈钢膨胀节价格_非金属伸缩节定制-庆达补偿器 | 儿童乐园|游乐场|淘气堡招商加盟|室内儿童游乐园配套设备|生产厂家|开心哈乐儿童乐园 | 网架支座@球铰支座@钢结构支座@成品支座厂家@万向滑动支座_桥兴工程橡胶有限公司 | 生产自动包装秤_颗粒包装秤_肥料包装秤等包装机械-郑州鑫晟重工科技有限公司 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 机制砂选粉机_砂石选粉机厂家-盐城市助成粉磨科技有限公司 | 「阿尔法设计官网」工业设计_产品设计_产品外观设计 深圳工业设计公司 | 液压油缸-液压缸厂家价格,液压站系统-山东国立液压制造有限公司 液压油缸生产厂家-山东液压站-济南捷兴液压机电设备有限公司 | 地源热泵一体机,地源热泵厂家-淄博汇能环保设备有限公司 | 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | 东莞螺丝|东莞螺丝厂|东莞不锈钢螺丝|东莞组合螺丝|东莞精密螺丝厂家-东莞利浩五金专业紧固件厂家 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 胀套-锁紧盘-风电锁紧盘-蛇形联轴器「厂家」-瑞安市宝德隆机械配件有限公司 | 钢制拖链生产厂家-全封闭钢制拖链-能源钢铝拖链-工程塑料拖链-河北汉洋机械制造有限公司 | 冷却塔风机厂家_静音冷却塔风机_冷却塔电机维修更换维修-广东特菱节能空调设备有限公司 | 进口消泡剂-道康宁消泡剂-陶氏消泡剂-大洋消泡剂 | 变频器维修公司_plc维修_伺服驱动器维修_工控机维修 - 夫唯科技 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 | 减速机三参数组合探头|TSM803|壁挂式氧化锆分析仪探头-安徽鹏宸电气有限公司 | 通信天线厂家_室分八木天线_对数周期天线_天线加工厂_林创天线源头厂家 | 中山市派格家具有限公司【官网】 | 上海公众号开发-公众号代运营公司-做公众号的公司企业服务商-咏熠软件 | 抖音短视频运营_企业网站建设_网络推广_全网自媒体营销-东莞市凌天信息科技有限公司 | 山东活动策划|济南活动公司|济南公关活动策划-济南锐嘉广告有限公司 | 扬尘在线监测系统_工地噪声扬尘检测仪_扬尘监测系统_贝塔射线扬尘监测设备「风途物联网科技」 | 【MBA备考网】-2024年工商管理硕士MBA院校/报考条件/培训/考试科目/提前面试/考试/学费-MBA备考网 | 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 深圳善跑体育产业集团有限公司_塑胶跑道_人造草坪_运动木地板 | 英国公司注册-新加坡公司注册-香港公司开户-离岸公司账户-杭州商标注册-杭州优创企业 | 高温热泵烘干机,高温烘干热泵,热水设备机组_正旭热泵 | 绿叶|绿叶投资|健康产业_绿叶投资集团有限公司 | 气动球阀_衬氟蝶阀_调节阀_电动截止阀_上海沃托阀门有限公司 | 英思科GTD-3000EX(美国英思科气体检测仪MX4MX6)百科-北京嘉华众信科技有限公司 |