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

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

詳解SpringBoot定制@ResponseBody注解返回的Json格式

瀏覽:6日期:2023-04-11 09:38:29

1、引言

在SpringMVC的使用中,后端與前端的交互一般是使用Json格式進(jìn)行數(shù)據(jù)傳輸,SpringMVC的@ResponseBody注解可以很好的幫助我們進(jìn)行轉(zhuǎn)換,但是后端返回?cái)?shù)據(jù)給前端往往都有約定固定的格式,這時(shí)候我們?cè)诤蠖朔祷氐臅r(shí)候都要組拼成固定的格式,每次重復(fù)的操作非常麻煩。

2、SpringMVC對(duì)@ResponseBody的處理

SpringMVC處理@ResponseBody注解聲明的Controller是使用默認(rèn)的.RequestResponseBodyMethodProcessor類來(lái)實(shí)現(xiàn),RequestResponseBodyMethodProcessor類實(shí)現(xiàn)了HandlerMethodReturnValueHandler接口并實(shí)現(xiàn)了接口中的supportsReturnType()和handleReturnValue()方法。

/* * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an 'AS IS' BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.springframework.web.method.support;import org.springframework.core.MethodParameter;import org.springframework.lang.Nullable;import org.springframework.web.context.request.NativeWebRequest;/** * Strategy interface to handle the value returned from the invocation of a * handler method . * * @author Arjen Poutsma * @since 3.1 * @see HandlerMethodArgumentResolver */public interface HandlerMethodReturnValueHandler { /** * Whether the given {@linkplain MethodParameter method return type} is * supported by this handler. * @param returnType the method return type to check * @return {@code true} if this handler supports the supplied return type; * {@code false} otherwise */ boolean supportsReturnType(MethodParameter returnType); /** * Handle the given return value by adding attributes to the model and * setting a view or setting the * {@link ModelAndViewContainer#setRequestHandled} flag to {@code true} * to indicate the response has been handled directly. * @param returnValue the value returned from the handler method * @param returnType the type of the return value. This type must have * previously been passed to {@link #supportsReturnType} which must * have returned {@code true}. * @param mavContainer the ModelAndViewContainer for the current request * @param webRequest the current request * @throws Exception if the return value handling results in an error */ void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception;}

3、實(shí)現(xiàn)思路

知道@ResponseBody是由RequestResponseBodyMethodProcessor進(jìn)行處理的,這時(shí)候我們可以自己定義一個(gè)處理返回?cái)?shù)據(jù)的Handler來(lái)實(shí)現(xiàn)我們的定制化Json格式數(shù)據(jù)返回,但是如果直接把我們定制的Handler加入到SpringMVC的ReturnValueHandlers中,因?yàn)槲覀兌ㄖ频腍andler在RequestResponseBodyMethodProcessor之后,所以我們定制的Handler還是不會(huì)生效,這時(shí)候我們可以想辦法把RequestResponseBodyMethodProcessor替換成我們定制的Handler。

4、代碼實(shí)現(xiàn)

4.1、定制Json返回格式實(shí)體

package com.autumn.template;import lombok.AllArgsConstructor;import lombok.Getter;import lombok.NoArgsConstructor;import lombok.Setter;import lombok.experimental.Accessors;/** * JSON信息交互對(duì)象模板 * @Author Autumn、 * @Date 2019/4/8 23:46 * @Description */@Setter@Getter@AllArgsConstructor@NoArgsConstructor@Accessors(chain = true)public class Result implements BaseBean { ......(這里只展示一些必要字段) /** 響應(yīng)碼 */ private Integer code; /** 響應(yīng)信息 */ private String message; /** 數(shù)據(jù) */ private Object data; /** 請(qǐng)求地址 */ private String url; ......}

4.2、定義定制Json返回格式Handler

package com.autumn.component.handler;import com.autumn.template.Result;import org.springframework.core.MethodParameter;import org.springframework.lang.Nullable;import org.springframework.web.context.request.NativeWebRequest;import org.springframework.web.method.support.HandlerMethodReturnValueHandler;import org.springframework.web.method.support.ModelAndViewContainer;/** * 統(tǒng)一處理ResponseBody數(shù)據(jù)格式 * @Author: Autumn、 * @Date: 2019/4/24 23:59 * @Description: **/public class ResultWarpReturnValueHandler implements HandlerMethodReturnValueHandler { private final HandlerMethodReturnValueHandler delegate; /** 委托 */ public ResultWarpReturnValueHandler(HandlerMethodReturnValueHandler delegate) { this.delegate = delegate; } /** * 判斷返回類型是否需要轉(zhuǎn)成字符串返回 * @param returnType 方法返回類型 * @return 需要轉(zhuǎn)換返回true,否則返回false */ @Override public boolean supportsReturnType(MethodParameter returnType) { return delegate.supportsReturnType(returnType); } /** * 返回值轉(zhuǎn)換 */ @Override public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception { // 委托SpringMVC默認(rèn)的RequestResponseBodyMethodProcessor進(jìn)行序列化 delegate.handleReturnValue(returnValue instanceof Result ? returnValue : Result.succeed(returnValue), returnType, mavContainer, webRequest); }}

4.3、替換默認(rèn)的RequestResponseBodyMethodProcessor

package com.autumn.config;import com.autumn.component.handler.ResultWarpReturnValueHandler;import org.springframework.beans.factory.InitializingBean;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.annotation.EnableCaching;import org.springframework.context.annotation.Configuration;import org.springframework.web.method.support.HandlerMethodReturnValueHandler;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;import org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor;import java.util.ArrayList;import java.util.List;import lombok.extern.slf4j.Slf4j;/** * 替換默認(rèn)的RequestResponseBodyMethodProcessor * @Author Autumn、 * @Date 2019/4/8 23:46 * @Description */@Slf4j@Configuration@EnableCachingpublic class ApplicationContext implements WebMvcConfigurer, InitializingBean { @Autowired(required = false) private RequestMappingHandlerAdapter adapter; @Override public void afterPropertiesSet() throws Exception { // 獲取SpringMvc的ReturnValueHandlers List<HandlerMethodReturnValueHandler> returnValueHandlers = adapter.getReturnValueHandlers(); // 新建一個(gè)List來(lái)保存替換后的Handler的List List<HandlerMethodReturnValueHandler> handlers = new ArrayList<>(returnValueHandlers); // 循環(huán)遍歷找出RequestResponseBodyMethodProcessor for (HandlerMethodReturnValueHandler handler : handlers) { if (handler instanceof RequestResponseBodyMethodProcessor) { // 創(chuàng)建定制的Json格式處理HandlerResultWarpReturnValueHandler decorator = new ResultWarpReturnValueHandler(handler);// 使用定制的Json格式處理Handler替換原有的RequestResponseBodyMethodProcessorint index = handlers.indexOf(handler);handlers.set(index, decorator);break; } } // 重新設(shè)置SpringMVC的ReturnValueHandlers adapter.setReturnValueHandlers(handlers); }}

5、總結(jié)

至此完成了定制@ResponseBody注解返回的Json格式,在Controller中返回任何的字符串都可以定制成為我們想要的Json格式。此外SpringMVC還提供了非常多的Handler接口來(lái)進(jìn)行Controller的增強(qiáng),可以使用此思路對(duì)參數(shù)等進(jìn)行定制化。

到此這篇關(guān)于詳解SpringBoot定制@ResponseBody注解返回的Json格式的文章就介紹到這了,更多相關(guān)SpringBoot @ResponseBody返回Json內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 河北中仪伟创试验仪器有限公司是专业生产沥青,土工,水泥,混凝土等试验仪器的厂家,咨询电话:13373070969 | 带锯机|木工带锯机圆木推台锯|跑车带锯机|河北茂业机械制造有限公司| | 云南标线|昆明划线|道路标线|交通标线-就选云南云路施工公司-云南云路科技有限公司 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 国资灵活用工平台_全国灵活用工平台前十名-灵活用工结算小帮手 | 海尔生物医疗四川代理商,海尔低温冰箱四川销售-成都壹科医疗器械有限公司 | 土壤水分自动监测站-SM150便携式土壤水分仪-铭奥仪器 | 净水器代理,净水器招商,净水器加盟-FineSky德国法兹全屋净水 | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | 高通量组织研磨仪-多样品组织研磨仪-全自动组织研磨仪-研磨者科技(广州)有限公司 | 100国际学校招生 - 专业国际学校择校升学规划 | 全自动五线打端沾锡机,全自动裁线剥皮双头沾锡机,全自动尼龙扎带机-东莞市海文能机械设备有限公司 | 天津货架厂_穿梭车货架_重型仓储货架_阁楼货架定制-天津钢力仓储货架生产厂家_天津钢力智能仓储装备 | DWS物流设备_扫码称重量方一体机_快递包裹分拣机_广东高臻智能装备有限公司 | 压力控制器,差压控制器,温度控制器,防爆压力控制器,防爆温度控制器,防爆差压控制器-常州天利智能控制股份有限公司 | 精密五金加工厂-CNC数控车床加工_冲压件|蜗杆|螺杆加工「新锦泰」 | 柔性测斜仪_滑动测斜仪-广州杰芯科技有限公司| 水质监测站_水质在线分析仪_水质自动监测系统_多参数水质在线监测仪_水质传感器-山东万象环境科技有限公司 | 酶联免疫分析仪-多管旋涡混合仪|混合器-莱普特科学仪器(北京)有限公司 | RTO换向阀_VOC高温阀门_加热炉切断阀_双偏心软密封蝶阀_煤气蝶阀_提升阀-湖北霍科德阀门有限公司 | 纯水电导率测定仪-万用气体检测仪-低钠测定仪-米沃奇科技(北京)有限公司www.milwaukeeinst.cn 锂辉石检测仪器,水泥成分快速分析仪-湘潭宇科分析仪器有限公司 手术室净化装修-手术室净化工程公司-华锐手术室净化厂家 | 复合土工膜厂家|hdpe防渗土工膜|复合防渗土工布|玻璃纤维|双向塑料土工格栅-安徽路建新材料有限公司 | 西安微信朋友圈广告投放_微信朋友圈推广_西安度娘网络科技有限公司 | 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 制丸机,小型中药制丸机,全自动制丸机价格-甘肃恒跃制药设备有限公司 | 机房监控|动环监控|动力环境监控系统方案产品定制厂家 - 迈世OMARA | 阳光模拟试验箱_高低温试验箱_高低温冲击试验箱_快速温变试验箱|东莞市赛思检测设备有限公司 | 上海公司注册-代理记账-招投标审计-上海昆仑扇财税咨询有限公司 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 别墅图纸超市|别墅设计图纸|农村房屋设计图|农村自建房|别墅设计图纸及效果图大全 | 紫外可见光分光度计-紫外分光度计-分光光度仪-屹谱仪器制造(上海)有限公司 | 成都网站建设制作_高端网站设计公司「做网站送优化推广」 | 钢制拖链生产厂家-全封闭钢制拖链-能源钢铝拖链-工程塑料拖链-河北汉洋机械制造有限公司 | 自动焊锡机_点胶机_螺丝机-锐驰机器人 | 缝纫客| 房车价格_依维柯/大通/东风御风/福特全顺/江铃图片_云梯搬家车厂家-程力专用汽车股份有限公司 | 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 陕西高职单招-陕西高职分类考试网 | 建筑资质代办-建筑企业资质代办机构-建筑资质代办公司 |