欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot全局Controller返回值格式統(tǒng)一

 更新時間:2021年07月29日 15:13:12   作者:TianXinCoord  
本文主要介紹了SpringBoot全局Controller返回值格式統(tǒng)一,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、返回值格式統(tǒng)一

1.返回值介紹

在使用controller對外提供服務的時候,很多時候都需要統(tǒng)一返回值格式,例如

{
	"status": true,
	"message": null,
	"code": "200",
	"data": {
		"name": "json",
		"desc": "json返回值"
	}
}

如果不使用全局統(tǒng)一返回,就需要寫一個工具類,然后controller返回對應的對象

@Data
public class ResponseData {
    private boolean status;
    private String message;
    private String code;
    private Object data;
}
@RequestMapping("/foo")
public ResponseData foo() {
    // 或者使用工具類返回,根據業(yè)務設置值
    return new ResponseData();
}

除了上述方法,可以對返回值進行統(tǒng)一處理,不需要對所有controller都使用一個返回值,controller只需要返回原始值,處理器會對返回值進行封裝

同時也可以添加自定義注解,此注解用于忽略返回值封裝,按照controller原始值返回

2.基礎類功能

org.springframework.web.method.support.HandlerMethodReturnValueHandler

  • 使用不同策略處理從調用處理程序方法的返回值
  • 策略處理頂層接口,自定義返回值格式需要實現此接口
  • supportsReturnType:設置支持返回值類型
  • handleReturnValue:處理返回值基礎參數

在這里插入圖片描述

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

  • 請求映射處理適配,包含了參數、返回值處理器等信息
  • HandlerMethodReturnValueHandlerComposite內部維護了HandlerMethodReturnValueHandler列表

在這里插入圖片描述在這里插入圖片描述

可以自定義注解,用于類或者方法級別忽略返回值封裝

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IgnoreResponseWrapper {

}

org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor

  • 屬于HandlerMethodReturnValueHandler子類
  • 主要功能是對請求和響應體的做處理的方法
  • 所有屬于RequestResponseBodyMethodProcessor的子類都需要替換為自定義返回值處理

實現原理就是,在bean初始化的時候,獲取到所有處理器數組,然后將所有是RequestResponseBodyMethodProcessor處理器子類對返回值處理的過程替換為自定義處理器

處理這樣當調用對應返回值處理器時,將會使用到自定義的返回值處理器,也就是所有返回值都會按照規(guī)定的進行處理

3.基礎實現

創(chuàng)建普通springboot項目,項目創(chuàng)建在此不做說明

創(chuàng)建類實現HandlerMethodReturnValueHandler接口,主要用于實現自定義返回值內容,不需要注入容器

import com.codecoord.unifyreturn.annotation.IgnoreResponseWrapper;
import com.codecoord.unifyreturn.domain.ResponseBase;
import org.springframework.core.MethodParameter;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.method.support.ModelAndViewContainer;

public class ResponseBodyWrapHandler implements HandlerMethodReturnValueHandler {
    private final HandlerMethodReturnValueHandler delegate;

    public ResponseBodyWrapHandler(HandlerMethodReturnValueHandler delegate) {
        this.delegate = delegate;
    }

    @Override
    public boolean supportsReturnType(MethodParameter returnType) {
        return delegate.supportsReturnType(returnType);
    }

    @Override
    public void handleReturnValue(Object returnValue,
                                  MethodParameter returnType,
                                  ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest) throws Exception {
        // 如果類或者方法含有不包裝注解則忽略包裝
        IgnoreResponseWrapper wrapper = returnType.getDeclaringClass().getAnnotation(IgnoreResponseWrapper.class);
        if (wrapper != null) {
            delegate.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
            return;
        }
        wrapper = returnType.getMethodAnnotation(IgnoreResponseWrapper.class);
        if (wrapper != null) {
            delegate.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
            return;
        }
        
        // 自定義返回格式
        ResponseBase responseBase = new ResponseBase();
        responseBase.setStatus(true);
        responseBase.setCode("200");
        responseBase.setData(returnValue);
        delegate.handleReturnValue(responseBase, returnType, mavContainer, webRequest);
    }
}

創(chuàng)建類實現InitializingBean,在初始化時調用,需要注入到容器中,否則Spring無法管理

import java.util.ArrayList;
import java.util.List;

@Component
public class ResponseBodyWrapFactoryBean implements InitializingBean {
    private final RequestMappingHandlerAdapter adapter;

    @Autowired
    public ResponseBodyWrapFactoryBean(RequestMappingHandlerAdapter adapter) {
        this.adapter = adapter;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        List<HandlerMethodReturnValueHandler> returnValueHandlers = adapter.getReturnValueHandlers();
        if (returnValueHandlers.size() > 0) {
        	// 將內置的返回值處理器進行替換
            List<HandlerMethodReturnValueHandler> handlers = new ArrayList<>(returnValueHandlers);
            decorateHandlers(handlers);
            adapter.setReturnValueHandlers(handlers);
        }
    }

    /** 
     * 將所有RequestResponseBodyMethodProcessor返回值處理器替換為自定義的返回值處理器
     *
     * @author tianxincode@163.com
     * @since 2020/10/12
     */
    private void decorateHandlers(List<HandlerMethodReturnValueHandler> handlers) {
        for (HandlerMethodReturnValueHandler handler : handlers) {
            if (handler instanceof RequestResponseBodyMethodProcessor) {
            	// 替換為自定義返回值處理器
                ResponseBodyWrapHandler decorator = new ResponseBodyWrapHandler(handler);
                int index = handlers.indexOf(handler);
                handlers.set(index, decorator);
                break;
            }
        }
    }
}

創(chuàng)建controller信息,例如此處map不需要封裝,按照原來格式響應

@RestController
@RequestMapping("/unify")
public class UnifyReturnValueController {

    @RequestMapping("string")
    public String stringHandler(){
        return "接收成功了";
    }

    @RequestMapping("/json")
    public JSONObject jsonHandler(){
        JSONObject object = new JSONObject();
        object.put("name", "json");
        object.put("desc", "json返回值");
        return object;
    }

    @RequestMapping("/map")
    @IgnoreResponseWrapper
    public Map<String, Object> mapHandler(){
        Map<String, Object> map = new HashMap<>(10);
        map.put("name", "map");
        map.put("desc", "map返回值");
        return map;
    }

    @RequestMapping("/list")
    public List<Object> listHandler(){
        List<Object> data = new ArrayList<>();
        data.add(100);
        data.add(95);
        data.add(99);
        return data;
    }
}

4.測試信息 測試json(有封裝)

{
	"status": true,
	"message": null,
	"code": "200",
	"data": {
		"name": "json",
		"desc": "json返回值"
	}
}

測試map(無封裝)

{
	"name": "map",
	"desc": "map返回值"
}

別的方法測試一樣

二、附錄說明

項目結構參考紅框部分,別的忽略

在這里插入圖片描述

除了對返回值進行全局統(tǒng)一,也可以對異常進行全局處理和按照統(tǒng)一格式返回

到此這篇關于SpringBoot全局Controller返回值格式統(tǒng)一的文章就介紹到這了,更多相關SpringBoot返回值格式統(tǒng)一內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java Cmd運行Jar出現亂碼的解決方案

    Java Cmd運行Jar出現亂碼的解決方案

    這篇文章主要介紹了Java Cmd運行Jar出現亂碼的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring?Data?JPA?映射VO/DTO對象方式

    Spring?Data?JPA?映射VO/DTO對象方式

    這篇文章主要介紹了Spring?Data?JPA?映射VO/DTO對象方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java String[]字符串數組自動排序的簡單實現

    java String[]字符串數組自動排序的簡單實現

    下面小編就為大家?guī)硪黄猨ava String[]字符串數組自動排序的簡單實現。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • SpringBoot Mybatis如何配置多數據源并分包

    SpringBoot Mybatis如何配置多數據源并分包

    這篇文章主要介紹了SpringBoot Mybatis如何配置多數據源并分包,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • java  中ThreadLocal實例分析

    java 中ThreadLocal實例分析

    這篇文章主要介紹了java 中ThreadLocal實例分析的相關資料,需要的朋友可以參考下
    2017-06-06
  • Java實戰(zhàn)員工績效管理系統(tǒng)的實現流程

    Java實戰(zhàn)員工績效管理系統(tǒng)的實現流程

    只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+Mysql+Maven+HTML實現一個員工績效管理系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2022-01-01
  • Java采用setAsciiStream方法檢索數據庫指定內容實例解析

    Java采用setAsciiStream方法檢索數據庫指定內容實例解析

    這篇文章主要介紹了Java采用setAsciiStream方法檢索數據庫指定內容,是比較實用的功能,需要的朋友可以參考下
    2014-08-08
  • Spring Web MVC和Hibernate的集成配置詳解

    Spring Web MVC和Hibernate的集成配置詳解

    這篇文章主要介紹了Spring Web MVC和Hibernate的集成配置詳解,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • 用Java將字符串的首字母轉換大小寫

    用Java將字符串的首字母轉換大小寫

    在項目開發(fā)的時候會需要統(tǒng)一字符串的格式,比如首字母要求統(tǒng)一大寫或小寫,那用Java如何實現這一功能?下面一起來學習學習。
    2016-08-08
  • SpringMVC注解@CrossOrigin跨域問題詳解

    SpringMVC注解@CrossOrigin跨域問題詳解

    這篇文章主要介紹了SpringMVC注解@CrossOrigin跨域問題詳解,跨域是瀏覽同源策略的造成,是瀏覽器對JavaScript施加的安全限制CORS是一種可以解決跨域問題的技術,需要的朋友可以參考下
    2023-11-11

最新評論