亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot?@RestControllerAdvice注解對返回值統(tǒng)一封裝的處理方法

 更新時間:2022年09月26日 11:07:24   作者:fengyehongWorld  
這篇文章主要介紹了SpringBoot?@RestControllerAdvice注解對返回值統(tǒng)一封裝,使用@RestControllerAdvice對響應進行增強,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一. 需求場景

如下圖所示,后臺向前臺響應數(shù)據(jù)的時候,所有的數(shù)據(jù)都需要放入自定義的封裝Entity才返回給前臺?,F(xiàn)在想要每個Controller中的方法將原數(shù)據(jù)直接返回,然后通過某種方法統(tǒng)一封裝處理。

二. 前期準備

?獲取狀態(tài)碼的接口

public interface IStatusCode {

    int getCode();

    String getMsg();
}

?響應狀態(tài)碼的枚舉類

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum ResultCodeEnum implements IStatusCode {

    SUCCESS(1000, "請求成功"),
    FAILED(1001, "請求失敗"),
    VALIDATE_ERROR(1002, "參數(shù)校驗失敗"),
    RESPONSE_PACK_ERROR(1003, "response返回包裝失敗");

    private int code;
    private String msg;
}

?業(yè)務狀態(tài)碼的枚舉類

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum BusinessCodeEnum implements IStatusCode {

    APP_ERROR(2000, "業(yè)務異常"),
    PRICE_ERROR(2001, "價格異常");

    private int code;
    private String msg;
}

?自定義業(yè)務異常類

import lombok.Getter;

@Getter
public class BusinessException extends RuntimeException {

    private int code;

    private String msg;

    // 手動設(shè)置異常
    public BusinessException(IStatusCode codeEnum, String message) {
        // message用于用戶設(shè)置拋出錯誤詳情
        super(message);
        // 狀態(tài)碼
        this.code = codeEnum.getCode();
        // 狀態(tài)碼配套的msg
        this.msg = codeEnum.getMsg();
    }

    // 默認異常使用APP_ERROR狀態(tài)碼
    public BusinessException(String message) {
        super(message);
        this.code = BusinessCodeEnum.APP_ERROR.getCode();
        this.msg = BusinessCodeEnum.APP_ERROR.getMsg();
    }
}

?自定義注解,標記該注解的方法不進行響應增強
讓我們的方法更加靈活,可以選擇增強封裝或者不增強。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NotControllerResponseAdvice {
}

三. 使用@RestControllerAdvice對響應進行增強

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import java.util.Arrays;
import java.util.List;

// 對指定包下面的Controller進行增強
@RestControllerAdvice(basePackages = {"com.example.jmw.controller"})
public class ControllerResponseAdvice implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> converterType) {

        List<Boolean> judgeResultList = Arrays.asList(
                // ?判斷相應的類型是否為ResultVo類型
                methodParameter.getParameterType().isAssignableFrom(ResultVo.class),
                // ?判斷響應的方法上是否包含 NotControllerResponseAdvice 注解
                methodParameter.hasMethodAnnotation(NotControllerResponseAdvice.class)
        );

        // 若包含其中一項,則不進行封裝
        return !judgeResultList.contains(true);
    }

    @Override
    public Object beforeBodyWrite(Object body
            , MethodParameter returnType
            , MediaType selectedContentType
            , Class<? extends HttpMessageConverter<?>> selectedConverterType
            , ServerHttpRequest request
            , ServerHttpResponse response
    ) {

        // String類型不能直接包裝
        if (returnType.getGenericParameterType().equals(String.class)) {
            ObjectMapper objectMapper = new ObjectMapper();
            try {
                // 將數(shù)據(jù)包裝在ResultVo里后轉(zhuǎn)換為json串進行返回
                return objectMapper.writeValueAsString(ResultVo.build(body));
            } catch (JsonProcessingException e) {
            	// 拋出自定義的業(yè)務異常
                throw new BusinessException(ResultCodeEnum.RESPONSE_PACK_ERROR, e.getMessage());
            }
        }

        // 否則直接包裝成ResultVo返回
        return ResultVo.build(body);
    }
}

四. 效果

4.1 直接返回List

@Controller
@RequestMapping("/test12")
public class Test12Controller {

    @PostMapping("/test")
    @ResponseBody
    public List<String> test() {

        return Arrays.asList("1", "2", "3");
    }
}

?List被包裝之后返回給前臺

4.2 標記NotControllerResponseAdvice注解后返回List

?List未被包裝,直接返回數(shù)據(jù)給前臺

4.3 直接返回字符串

4.4 直接返回ResultVo類型數(shù)據(jù)

?返回的就是ResultVo類型,無需包裝,直接返回數(shù)據(jù)給前臺

參考資料:

正規(guī)軍springboot如何處理:參數(shù)校驗、統(tǒng)一異常、統(tǒng)一響應

到此這篇關(guān)于SpringBoot @RestControllerAdvice注解對返回值統(tǒng)一封裝的文章就介紹到這了,更多相關(guān)SpringBoot返回值統(tǒng)一封裝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis SqlSessionFactory與SqlSession詳細講解

    Mybatis SqlSessionFactory與SqlSession詳細講解

    SqlSessionFactory是MyBatis的核心類之一,其最重要的功能就是提供創(chuàng)建MyBatis的核心接口SqlSession,所以我們需要先創(chuàng)建SqlSessionFactory,為此我們需要提供配置文件和相關(guān)的參數(shù)
    2022-11-11
  • SpringBoot整合HTTPS的項目實踐

    SpringBoot整合HTTPS的項目實踐

    HTTPS的主要作用是通過SSL證書保護用戶數(shù)據(jù)的安全與隱私,增加網(wǎng)站信任度,防止數(shù)據(jù)被竊取和篡改,保護網(wǎng)站免受釣魚攻擊,本文就來介紹一下,感興趣的可以了解一下
    2024-10-10
  • 詳解Mybatis攔截器安全加解密MySQL數(shù)據(jù)實戰(zhàn)

    詳解Mybatis攔截器安全加解密MySQL數(shù)據(jù)實戰(zhàn)

    本文主要介紹了Mybatis攔截器安全加解密MySQL數(shù)據(jù)實戰(zhàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java復制一個對象并且不想復制其中的空值屬性問題

    Java復制一個對象并且不想復制其中的空值屬性問題

    這篇文章主要介紹了Java復制一個對象并且不想復制其中的空值屬性問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Java怎樣判斷堆區(qū)中的對象可以被回收了

    Java怎樣判斷堆區(qū)中的對象可以被回收了

    文章介紹了Java垃圾回收機制的工作原理,主要通過引用計數(shù)法和可達性分析法來判斷對象是否可以被回收,引用計數(shù)法存在循環(huán)引用問題,而可達性分析法則使用GCRoot對象來判斷對象是否可達,從而決定是否回收,這兩種方法各有優(yōu)缺點,但Java最終采用了可達性分析法來實現(xiàn)垃圾回收
    2024-12-12
  • springmvc常用注解標簽詳解

    springmvc常用注解標簽詳解

    本篇文章主要介紹了springmvc常用注解標簽詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 詳解java的四舍五入與保留位示例

    詳解java的四舍五入與保留位示例

    本篇文章主要介紹了java的四舍五入與保留位示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 解讀RabbitMQ和kafka的相同點和不同點是什么

    解讀RabbitMQ和kafka的相同點和不同點是什么

    RabbitMQ和Kafka都是消息中間件,支持分布式系統(tǒng)、高可用性和可靠性,RabbitMQ使用隊列模型,適合復雜路由場景;Kafka使用主題-分區(qū)模型,適合大規(guī)模數(shù)據(jù)流處理,RabbitMQ在低延遲方面表現(xiàn)更好,Kafka在高吞吐量方面表現(xiàn)更好
    2024-12-12
  • MybatisPlus創(chuàng)建時間不想用默認值的問題

    MybatisPlus創(chuàng)建時間不想用默認值的問題

    MybatisPlus通過FieldFill注解和MpMetaObjectHandler類支持自動填充字段功能,特別地,可以設(shè)置字段在插入或更新時自動填充創(chuàng)建時間和更新時間,但在特定場景下,如導入數(shù)據(jù)時,可能需要自定義創(chuàng)建時間
    2024-09-09
  • SpringBoot實現(xiàn)數(shù)據(jù)源動態(tài)切換的最佳姿勢

    SpringBoot實現(xiàn)數(shù)據(jù)源動態(tài)切換的最佳姿勢

    這篇文章主要為大家詳細介紹一下SpringBoot實現(xiàn)數(shù)據(jù)源動態(tài)切換的最佳姿勢,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-03-03

最新評論