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

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

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

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

1、引言

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

2、SpringMVC對@ResponseBody的處理

SpringMVC處理@ResponseBody注解聲明的Controller是使用默認的.RequestResponseBodyMethodProcessor類來實現(xiàn),RequestResponseBodyMethodProcessor類實現(xiàn)了HandlerMethodReturnValueHandler接口并實現(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、實現(xiàn)思路

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

4、代碼實現(xiàn)

4.1、定制Json返回格式實體

package com.autumn.template;import lombok.AllArgsConstructor;import lombok.Getter;import lombok.NoArgsConstructor;import lombok.Setter;import lombok.experimental.Accessors;/** * JSON信息交互對象模板 * @Author Autumn、 * @Date 2019/4/8 23:46 * @Description */@Setter@Getter@AllArgsConstructor@NoArgsConstructor@Accessors(chain = true)public class Result implements BaseBean { ......(這里只展示一些必要字段) /** 響應碼 */ private Integer code; /** 響應信息 */ private String message; /** 數(shù)據(jù) */ private Object data; /** 請求地址 */ 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默認的RequestResponseBodyMethodProcessor進行序列化 delegate.handleReturnValue(returnValue instanceof Result ? returnValue : Result.succeed(returnValue), returnType, mavContainer, webRequest); }}

4.3、替換默認的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;/** * 替換默認的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(); // 新建一個List來保存替換后的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接口來進行Controller的增強,可以使用此思路對參數(shù)等進行定制化。

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

標簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产成人精品一区二区三区在线| 亚久久调教视频| 国产探花一区在线观看| 喷白浆一区二区| 99热精品在线| 伊人久久大香线蕉av超碰演员| 激情欧美日韩一区| 99国产精品私拍| 久久国产福利| 日韩激情一二三区| 国产精品亚洲人成在99www| 国产精品网址| 日韩综合一区| 秋霞影视一区二区三区| 婷婷精品视频| 亚洲综合精品四区| 日韩精品一二区| 亚洲精选久久| 欧美午夜网站| 国产精品99一区二区三区| 久久精品导航| 免播放器亚洲一区| 欧美日韩视频免费看| 精品国产美女a久久9999| 日韩av福利| 国产一区二区高清| 日韩高清二区| 精品三级av在线导航| 久久国产毛片| 亚洲区第一页| 欧美激情aⅴ一区二区三区 | 亚洲在线网站| 亚洲精品美女| 麻豆视频观看网址久久| 欧美成人基地| 免费人成精品欧美精品| 国产麻豆精品久久| 久久久久网站| 日韩欧美2区| 国产成人精选| 视频一区视频二区中文| 国产精品网在线观看| 久久久久久久久99精品大| 国产精品美女| 久久av影院| 欧美+日本+国产+在线a∨观看| 免费看欧美美女黄的网站| 免费在线日韩av| 影院欧美亚洲| 国际精品欧美精品| 久久亚洲风情| 国产精品99一区二区三| 乱人伦精品视频在线观看| 美腿丝袜亚洲一区| aa亚洲婷婷| 精品色999| 蜜臀av一区二区在线免费观看 | 亚洲精品一二| 91亚洲国产成人久久精品| 蜜臀av一区二区在线免费观看| 久久久久久久久成人| 国产亚洲网站| 欧美丰满日韩| 奇米色欧美一区二区三区| 日韩精品永久网址| 日本不卡一区二区三区| 亚洲视频综合| 欧美国产视频| 日韩中文字幕91| 91一区二区三区四区| 亚洲精选成人| 五月婷婷六月综合| 国产福利资源一区| 一区二区国产在线| 欧美日韩在线网站| 精品淫伦v久久水蜜桃| 亚洲三级观看| 亚洲激情国产| 亚洲天堂免费电影| 免费在线欧美黄色| 日韩高清一级| 亚洲欧美日本国产专区一区| 黄色在线网站噜噜噜| 国产精品一区高清| 亚洲欧洲免费| 亚洲尤物在线| 在线日韩视频| 久久精品国产免费| 欧美日韩一区二区三区不卡视频 | 好吊视频一区二区三区四区| 久久久久久一区二区| 国产欧美久久一区二区三区| 丝袜美腿亚洲一区二区图片| 久久免费黄色| 超碰超碰人人人人精品| 国产精品99久久免费观看| 最新国产精品视频| 亚洲一区网站| 国产精品99一区二区| 日韩久久精品| 国产成人精品一区二区三区免费 | 久久影视三级福利片| 国产伦一区二区三区| 日韩黄色免费网站| 亚洲精选久久| 男人的天堂久久精品| 亚洲精品a级片| 激情久久婷婷| 中文字幕人成乱码在线观看 | 精品免费在线| 国产精品免费不| 国产精品传媒麻豆hd| 国产精品22p| 麻豆精品在线观看| 国产激情久久| 国产精品久久| 六月丁香综合在线视频| 国产精品一区二区三区四区在线观看 | 99久久亚洲精品蜜臀| 久久精品观看| 久久精品国产大片免费观看| 99精品电影| 欧美一区三区| 国产一区观看| 国产精品日韩欧美一区| 夜夜精品视频| 视频在线观看一区二区三区| 亚洲免费影视| 亚洲人成网77777色在线播放| 香蕉久久久久久久av网站| 蜜桃av一区二区在线观看| 亚洲欧洲专区| 奇米亚洲欧美| 麻豆精品视频在线| 国产一区精品福利| 欧美13videosex性极品| 国产综合视频| 喷白浆一区二区| 97se亚洲| 成人在线免费观看网站| 成人自拍av| 伊人久久亚洲热| 亚洲人成网77777色在线播放| 日韩av影院| 国产美女精品视频免费播放软件| 美女精品视频在线| 成人在线网站| 亚洲一区成人| 欧美亚洲三区| 国产91在线精品| 国产综合精品| 亚洲乱码一区| 免费在线亚洲| 久久精品导航| 中文字幕av一区二区三区四区| 国产欧美综合一区二区三区| 中文字幕在线免费观看视频| 国产国产精品| 日韩精品久久理论片| 美女久久久久久| 国产91久久精品一区二区| 日本欧美在线看| 欧美国产先锋| 国产在线日韩| 日韩国产欧美在线播放| 丰满少妇一区| 99国产精品私拍| 国产欧美精品久久| 久久免费高清| 亚洲精品美女91| 国产一区2区在线观看| 好吊一区二区三区| 国产精品视频一区二区三区四蜜臂 | 亚洲乱码视频| 久久精品系列| 亚洲经典在线| 国产精品巨作av| 亚洲天堂久久| 国产调教精品| 久久久久99| 日韩不卡免费视频| 久久蜜桃精品| 91欧美精品| 亚洲午夜精品久久久久久app| 日韩1区2区日韩1区2区| 成人在线观看免费视频| 视频一区在线播放| 久久男人av| 蜜臀av一区二区三区| 成人免费一区| 日韩中文字幕一区二区高清99| а√天堂8资源中文在线| 久久香蕉精品| 日韩一区二区三区免费播放| 亚洲精品进入| 极品裸体白嫩激情啪啪国产精品| 国产麻豆精品| 三级在线观看一区二区| 日韩免费看片| 国产精品v一区二区三区|