最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot項目controller統(tǒng)一返回對象格式以及全局自定義異常方式

 更新時間:2025年11月03日 08:41:35   作者:0和1搭建網(wǎng)絡(luò)世界  
本文介紹了在Web接口開發(fā)中,統(tǒng)一封裝接口返回數(shù)據(jù)格式和處理運(yùn)行時異常的重要性,通過使用@ControllerAdvice和ResponseBodyAdvice,可以實(shí)現(xiàn)全局?jǐn)r截和封裝,為了處理Swagger請求,提出了解決方案,包括對Swagger請求放行和自定義注解攔截特定接口

一、需求背景

1.在web接口開發(fā)時,每個模塊接口返回數(shù)據(jù)格式需做封裝,如果每個模塊的返回格式不同,前端需要最不同數(shù)據(jù)格式的適配,使得整個項目很雜亂。如果對接口的返回數(shù)據(jù)做統(tǒng)一封裝就解決此類問題。

2.項目的運(yùn)行時異常,例如用戶名錯誤此類的提示性異常,需要對此類異常做統(tǒng)一性封裝。

二、方法

解決方法

問題一:使用@ControllerAdvice注解,以及實(shí)現(xiàn)ResponseBodyAdvice接口,從而實(shí)現(xiàn)攔截后再封裝邏輯

問題二:使用@ControllerAdvice和@ExceptionHandler注解配合使用,從而捕獲自定義異常類,實(shí)現(xiàn)邏輯的再處理。

三、具體實(shí)現(xiàn)

/**
*封裝的接口統(tǒng)一返回對象
*/
@Data
public class ResultPo<T> {
    private int code;
    private String msg;
    private T data;

    public static<T> ResultPo<T> success(T t){
        ResultPo<T> resultPo = new ResultPo<>();
        resultPo.setCode(ResponseCodeEnum.SUCCESS.getCode());
        resultPo.setMsg(ResponseCodeEnum.SUCCESS.getMessage());
        resultPo.setData(t);
        return resultPo;
    }

    public static ResultPo error(int code,String msg){
        ResultPo resultPo = new ResultPo();
        resultPo.setCode(code);
        resultPo.setMsg(msg);
        return resultPo;
    }
}

// 自定義異常類
@Getter
public class BusinessException extends RuntimeException{
    private String msg;
    private int code;

    public  BusinessException(String msg){
        super(msg);
        this.msg =msg;
        this.code = ResponseCodeEnum.FAIL.getCode();
    }

    public  BusinessException(String msg,int code){
        super(msg);
        this.msg =msg;
        this.code = code;
    }
}


@ResponseBody
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {

    Logger log = LoggerFactory.getLogger(ResponseAdvice.class);

	// 自定義異常捕獲
    @ExceptionHandler(BusinessException.class)
    public ResultPo customException(BusinessException bs){
        ResultPo resultPo = new ResultPo();
        resultPo.setCode(bs.getCode());
        resultPo.setMsg(bs.getMsg());
        resultPo.setData(null);
        return resultPo;
    }
	
	/**
	*return turn 代表此接口會進(jìn)入beforeBodyWrite方法,進(jìn)行邏輯處理
	*/
    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return !returnType.getDeclaringClass().getName().contains("springfox");
//        return true;
    }

    @Nullable
    @Override
    public Object beforeBodyWrite(@Nullable Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
    	// 如果接口返回為string類型,則需要單獨(dú)處理
        if(returnType.getGenericParameterType().equals(String.class)){
            ObjectMapper objectMapper = new ObjectMapper();
            try {
                HttpHeaders headers = response.getHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return objectMapper.writeValueAsString(ResultPo.success(body));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
        // 接口出現(xiàn)自定義異常,已被customException方法捕獲,則無需再次封裝
        if(returnType.getGenericParameterType().equals(ResultPo.class)){
            return body;
        }
        return ResultPo.success(body);
    }
}

四、遇到的問題

當(dāng)項目中使用swagger時,會攔截swagger的相關(guān)請求

出現(xiàn)的原因:@ControllerAdvice注解會攔截@Controller以及@RestController標(biāo)記的接口,而swagger的接口是web接口,也是帶有@RestController相關(guān)接口

解決方法:

1.對swagger進(jìn)行放行,就是上面代碼中那樣,放行帶有springfox字樣的接口

@Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return !returnType.getDeclaringClass().getName().contains("springfox");
//        return true;
    }

2.自定義一個注解,在需要統(tǒng)一返回值的接口上添加上自定義注解,然后@ControllerAdvice根據(jù)自定義注解進(jìn)行攔截

// ResponseResult為自定義注解
@ControllerAdvice(annotations = ResponseResult.class)

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot應(yīng)用線上重啟腳本的命令詳解

    SpringBoot應(yīng)用線上重啟腳本的命令詳解

    這篇文章主要介紹了SpringBoot應(yīng)用線上重啟腳本,通過查找應(yīng)用進(jìn)程PID,殺死應(yīng)用進(jìn)程PID,運(yùn)行啟動腳本,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • java RocketMQ快速入門基礎(chǔ)知識

    java RocketMQ快速入門基礎(chǔ)知識

    這篇文章主要介紹了java RocketMQ快速入門基礎(chǔ)知識,所以RocketMQ是站在巨人的肩膀上(kafka),又對其進(jìn)行了優(yōu)化讓其更滿足互聯(lián)網(wǎng)公司的特點(diǎn)。它是純Java開發(fā),具有高吞吐量、高可用性、適合大規(guī)模分布式系統(tǒng)應(yīng)用的特點(diǎn)。,需要的朋友可以參考下
    2019-06-06
  • Java基礎(chǔ)之多線程

    Java基礎(chǔ)之多線程

    以下是我們Java基礎(chǔ)多線程的一些知識點(diǎn)總結(jié),看完以后會覺得多線程也可以這么簡單,小編精心推薦,希望能對大家有所幫助
    2018-09-09
  • 解析Java中如何獲取Spring中配置的bean

    解析Java中如何獲取Spring中配置的bean

    本篇文章是對在Java中如何獲取Spring中配置的bean進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07
  • Java使用FFM?API調(diào)用SDL詳解

    Java使用FFM?API調(diào)用SDL詳解

    這篇文章主要為大家詳細(xì)介紹了Java如何使用FFM?API調(diào)用SDL,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2025-01-01
  • Springboot中com.mysql.cj.jdbc.Driver在yml文件中爆紅的原因解讀

    Springboot中com.mysql.cj.jdbc.Driver在yml文件中爆紅的原因解讀

    這篇文章主要介紹了Springboot中com.mysql.cj.jdbc.Driver在yml文件中爆紅的原因解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 貪心算法原理及在Java中的使用

    貪心算法原理及在Java中的使用

    我們可能在好多地方都會聽到貪心算法這一概念,并且它的算法思想也比較簡單就是說算法只保證局部最優(yōu),進(jìn)而達(dá)到全局最優(yōu)。但我們實(shí)際編程的過程中用的并不是很多,究其原因可能是貪心算法使用的條件比較苛刻,所要解決的問題必須滿足貪心選擇性質(zhì)
    2021-05-05
  • Java求出任意數(shù)字的各個位數(shù)之和方式

    Java求出任意數(shù)字的各個位數(shù)之和方式

    這篇文章主要介紹了Java求出任意數(shù)字的各個位數(shù)之和方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringBoot項目使用Liquibase數(shù)據(jù)庫版本管理方式

    SpringBoot項目使用Liquibase數(shù)據(jù)庫版本管理方式

    Liquibase是開源數(shù)據(jù)庫版本管理工具,支持多數(shù)據(jù)庫及多格式變更日志,實(shí)現(xiàn)變更追蹤、上下文執(zhí)行、文檔生成等功能,需配置目錄結(jié)構(gòu)及master.xml文件,注意@PostConstruct初始化順序問題,建議用CommandLineRunner替代
    2025-09-09
  • Java實(shí)現(xiàn)讀取html文本內(nèi)容并按照格式導(dǎo)出到excel中

    Java實(shí)現(xiàn)讀取html文本內(nèi)容并按照格式導(dǎo)出到excel中

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)讀取html文本提取相應(yīng)內(nèi)容按照格式導(dǎo)出到excel中,文中的示例代碼講解詳細(xì),需要的可以參考下
    2024-02-02

最新評論

吴江市| 得荣县| 乐平市| 霍城县| 禄丰县| 通江县| 广元市| 陆河县| 石首市| 潍坊市| 安义县| 额尔古纳市| 仙游县| 肇庆市| 砀山县| 青州市| 喀喇| 双江| 西乡县| 白水县| 南召县| 报价| 叙永县| 北票市| 乃东县| 广州市| 藁城市| 信阳市| 革吉县| 黑龙江省| 汉中市| 宁武县| 从化市| 泽普县| 济南市| 阿克苏市| 汉源县| 黄大仙区| 江门市| 从江县| 碌曲县|