亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

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

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

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

1、引言

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

2、SpringMVC對@ResponseBody的處理

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

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

4、代碼實現

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; /** 數據 */ 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;/** * 統一處理ResponseBody數據格式 * @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; } /** * 判斷返回類型是否需要轉成字符串返回 * @param returnType 方法返回類型 * @return 需要轉換返回true,否則返回false */ @Override public boolean supportsReturnType(MethodParameter returnType) { return delegate.supportsReturnType(returnType); } /** * 返回值轉換 */ @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); // 循環遍歷找出RequestResponseBodyMethodProcessor for (HandlerMethodReturnValueHandler handler : handlers) { if (handler instanceof RequestResponseBodyMethodProcessor) { // 創建定制的Json格式處理HandlerResultWarpReturnValueHandler decorator = new ResultWarpReturnValueHandler(handler);// 使用定制的Json格式處理Handler替換原有的RequestResponseBodyMethodProcessorint index = handlers.indexOf(handler);handlers.set(index, decorator);break; } } // 重新設置SpringMVC的ReturnValueHandlers adapter.setReturnValueHandlers(handlers); }}

5、總結

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

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

標簽: Spring
相關文章:
主站蜘蛛池模板: 香蕉亚洲精品一区二区 | 97理论三级九七午夜在线观看 | 麻豆影视在线观看 | 国产精品yjizz视频网一二区 | 免费特黄一级欧美大片在线看 | 国产啪爱视频精品免视 | 奇米影视狠狠久久中文 | 国产一区二区视频免费 | 免费a在线观看 | 免费高清不卡毛片在线看 | 521色香蕉网在线观看免费 | 综合欧美视频一区二区三区 | 免费av一区二区三区 | 大毛片 | 91精品国产自产91精品 | 日本一区精品久久久久影院 | 欧美一级欧美三级在线观看 | 爱爱网站在线观看免费 | 亚洲精品欧美一区二区三区 | 18黄网站 | 91www在线观看 | 日韩高清不卡在线 | 欧美一区二区三区久久久人妖 | 亚洲色图8p| 国产在线一区视频 | 青青久久精品国产免费看 | 国产精品人伦久久 | 新一级毛片国语版 | 欧美一区二区视频在线观看 | 麻豆成人在线 | 青青草视频破解版 | 欧美日本一道免费一区三区 | 伊人影院在线观看 | 成在线人免费视频 | 特黄特色网站 | 狠狠五月天中文字幕 | 一区二区三区高清在线观看 | 国产成人精选视频69堂 | 欧美一级大尺度毛片 | 亚洲 欧美 精品 中文第三 | 91在线视频观看 |