国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot定義優(yōu)雅全局統(tǒng)一Restful API 響應(yīng)框架六

這篇具有很好參考價(jià)值的文章主要介紹了SpringBoot定義優(yōu)雅全局統(tǒng)一Restful API 響應(yīng)框架六。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

閑話(huà)不多說(shuō),繼續(xù)優(yōu)化 全局統(tǒng)一Restful API 響應(yīng)框架 做到項(xiàng)目通用 接口可擴(kuò)展。

如果沒(méi)有看前面幾篇文章請(qǐng)先看前面幾篇

SpringBoot定義優(yōu)雅全局統(tǒng)一Restful API 響應(yīng)框架

SpringBoot定義優(yōu)雅全局統(tǒng)一Restful API 響應(yīng)框架二

SpringBoot定義優(yōu)雅全局統(tǒng)一Restful API 響應(yīng)框架三

SpringBoot定義優(yōu)雅全局統(tǒng)一Restful API 響應(yīng)框架四

SpringBoot定義優(yōu)雅全局統(tǒng)一Restful API 響應(yīng)框架五

這里講一講最后的版本和需要修復(fù)的一些問(wèn)題

 @PostMapping("/add/UserApiCombo")
    public R addApiCombo(@RequestBody @Validated UserApplyApiComboDto userApplyApiComboDto) {
        userApiComboService.addApiCombo(userApplyApiComboDto);
        return R.success();
    }

我們看看這個(gè)代碼,有什么問(wèn)題。 我們返回了統(tǒng)一的封裝結(jié)果集R 但是后面所有的controller 都這么寫(xiě)不太友好。

  1. 返回內(nèi)容這么不夠明確具體
  2. 所有controller 這么寫(xiě)增加重復(fù)工作量

我們可以這么去優(yōu)化:

Spirng 提供了 ResponseBodyAdvice 接口,支持在消息轉(zhuǎn)換器執(zhí)行轉(zhuǎn)換之前,對(duì)接口的返回結(jié)果進(jìn)行處理,再結(jié)合 @ControllerAdvice 注解即可輕松支持上述功能

package cn.soboys.springbootrestfulapi.common.handler;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.map.MapUtil;
import cn.soboys.springbootrestfulapi.common.error.ErrorDetail;
import cn.soboys.springbootrestfulapi.common.resp.R;
import lombok.extern.slf4j.Slf4j;
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.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

/**
 * @author 公眾號(hào) 程序員三時(shí)
 * @version 1.0
 * @date 2023/6/12 12:17 下午
 * @webSite https://github.com/coder-amiao
 * @Slf4j
 * @ControllerAdvice
 */
@Slf4j
@ControllerAdvice
public class ResponseResultHandler implements ResponseBodyAdvice<Object> {
    /**
     * supports方法: 判斷是否要執(zhí)行beforeBodyWrite方法,
     * true為執(zhí)行,false不執(zhí)行.
     * 通過(guò)該方法可以選擇哪些類(lèi)或那些方法的response要進(jìn)行處理, 其他的不進(jìn)行處理.
     *
     * @param returnType
     * @param converterType
     * @return
     */
    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    /**
     * beforeBodyWrite方法: 對(duì)response方法進(jìn)行具體操作處理
     * 實(shí)際返回結(jié)果業(yè)務(wù)包裝處理
     *
     * @param body
     * @param returnType
     * @param selectedContentType
     * @param selectedConverterType
     * @param request
     * @param response
     * @return
     */
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        if (body instanceof R) {
            return body;
        } else if (body == null) {
            return R.success();
        } else if (body instanceof ErrorDetail) {
            return body;
        } else if (body instanceof String) {
            return body;
        } else {
            return R.success().data(body);
        }
    }
}

在實(shí)際controller 返回中我們直接返回?cái)?shù)據(jù)內(nèi)容就可以了

    @GetMapping("/home")
    public Student home() {

        Student s = new Student();
        s.setUserName("Tom");
        s.setAge(22);
        List hobby = new ArrayList();
        hobby.add("抽煙");
        hobby.add("喝酒");
        hobby.add("燙頭");
        s.setHobby(hobby);
        s.setBalance(2229891.0892);
        s.setIdCard("420222199811207237");
        return s;
    }

我們目前版本中業(yè)務(wù)錯(cuò)誤判斷邏輯不是很友好,還需要優(yōu)化,這里我們可以封裝自己的業(yè)務(wù)異常
Assert(斷言) 封裝異常,讓代碼更優(yōu)雅

符合 錯(cuò)誤優(yōu)先返回原則

正常我們業(yè)務(wù)異常代碼是這樣寫(xiě)的

// 另一種寫(xiě)法
        Order order = orderDao.selectById(orderId);
        if (order == null) {
            throw new IllegalArgumentException("訂單不存在。");
        }

使用斷言?xún)?yōu)化后

 Order order = orderDao.selectById(orderId);
 Assert.notNull(order, "訂單不存在。");

兩種方式一對(duì)比,是不是明顯感覺(jué)第一種更優(yōu)雅,第二種寫(xiě)法則是相對(duì)丑陋的 if {...} 代碼塊。那么 神奇的 Assert.notNull() 背后到底做了什么呢?

這里就是我們需要優(yōu)化代碼

其實(shí)很多框架都帶有Assert 工具包括JAVA JDK . SpringBoot,spring 也有自己的Assert
但是不符合我們自己的異常拋出業(yè)務(wù)邏輯,這里我們可以自定義自定的Assert 工具

我們來(lái)看一下部分源碼

public abstract class Assert {
    public Assert() {
    }

    public static void notNull(@Nullable Object object, String message) {
        if (object == null) {
            throw new IllegalArgumentException(message);
        }
    }
}

可以看到,Assert 其實(shí)就是幫我們把 if {...} 封裝了一下,是不是很神奇。雖然很簡(jiǎn)單,但不可否認(rèn)的是編碼體驗(yàn)至少提升了一個(gè)檔次。

那么我們是不是可以模仿Assert也寫(xiě)一個(gè)自定義斷言類(lèi),不過(guò)斷言失敗后拋出的異常不是IllegalArgumentException 這些內(nèi)置異常,而是我們自己定義的異常。

  1. 定義公共異常
package cn.soboys.springbootrestfulapi.common.exception;

import cn.soboys.springbootrestfulapi.common.resp.ResultCode;
import lombok.Data;

/**
 * @author 公眾號(hào) 程序員三時(shí)
 * @version 1.0
 * @date 2023/6/12 10:32 下午
 * @webSite https://github.com/coder-amiao
 */
@Data
public class BaseException extends RuntimeException {
    /**
     * 返回碼
     */
    protected ResultCode resultCode;
    /**
     * 異常消息參數(shù)
     */
    protected Object[] args;

    public BaseException(ResultCode resultCode) {
        super(resultCode.getMessage());
        this.resultCode = resultCode;
    }


    public BaseException(String code, String msg) {
        super(msg);
        this.resultCode = new ResultCode() {
            @Override
            public String getCode() {
                return code;
            }

            @Override
            public String getMessage() {
                return msg;
            }

            @Override
            public boolean getSuccess() {
                return false;
            }

            ;
        };
    }

    public BaseException(ResultCode resultCode, Object[] args, String message) {
        super(message);
        this.resultCode = resultCode;
        this.args = args;
    }

    public BaseException(ResultCode resultCode, Object[] args, String message, Throwable cause) {
        super(message, cause);
        this.resultCode = resultCode;
        this.args = args;
    }

}
  1. 所有其他異常繼承公共異常
package cn.soboys.springbootrestfulapi.common.exception;


import cn.soboys.springbootrestfulapi.common.resp.ResultCode;


/**
 * @author 公眾號(hào) 程序員三時(shí)
 * @version 1.0
 * @date 2023/4/29 00:15
 * @webSite https://github.com/coder-amiao
 * 通用業(yè)務(wù)異常封裝
 */
public class BusinessException extends BaseException {

    
    public BusinessException(ResultCode resultCode, Object[] args, String message) {
        super(resultCode, args, message);
    }

    public BusinessException(ResultCode resultCode, Object[] args, String message, Throwable cause) {
        super(resultCode, args, message, cause);
    }

}

  1. 斷言業(yè)務(wù)異常類(lèi)封裝
public interface Assert {
    /**
     * 創(chuàng)建異常
     * @param args
     * @return
     */
    BaseException newException(Object... args);

    /**
     * 創(chuàng)建異常
     * @param t
     * @param args
     * @return
     */
    BaseException newException(Throwable t, Object... args);

    /**
     * <p>斷言對(duì)象<code>obj</code>非空。如果對(duì)象<code>obj</code>為空,則拋出異常
     *
     * @param obj 待判斷對(duì)象
     */
    default void assertNotNull(Object obj) {
        if (obj == null) {
            throw newException(obj);
        }
    }

    /**
     * <p>斷言對(duì)象<code>obj</code>非空。如果對(duì)象<code>obj</code>為空,則拋出異常
     * <p>異常信息<code>message</code>支持傳遞參數(shù)方式,避免在判斷之前進(jìn)行字符串拼接操作
     *
     * @param obj 待判斷對(duì)象
     * @param args message占位符對(duì)應(yīng)的參數(shù)列表
     */
    default void assertNotNull(Object obj, Object... args) {
        if (obj == null) {
            throw newException(args);
        }
    }
}

具體使用

/**
     * 異常返回模擬
     *
     * @return
     */
    @GetMapping("/exception")
    public Student  exception() {
        Student s = null;
        BusinessErrorCode.Sign_Error.assertNotNull(s,"secret秘鑰不正確");
        return s;
    }

在業(yè)務(wù)中我們可以通過(guò)這個(gè)方式直接拋出枚舉異常。這樣代碼就簡(jiǎn)潔干凈很多

代理已經(jīng)更新到 github倉(cāng)庫(kù)腳手架項(xiàng)目

關(guān)注公眾號(hào),程序員三時(shí) 持續(xù)輸出優(yōu)質(zhì)內(nèi)容 希望給你帶來(lái)一點(diǎn)啟發(fā)和幫助文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-481025.html

到了這里,關(guān)于SpringBoot定義優(yōu)雅全局統(tǒng)一Restful API 響應(yīng)框架六的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 微服務(wù)間請(qǐng)求響應(yīng)定義方式對(duì)比 (Apache Dubbo, IDL 定義,RESTful API)

    1. Apache Dubbo 分布式RPC Apache Dubbo 是一種分布式服務(wù)框架,它提供了一種透明的 RPC 機(jī)制,可以讓服務(wù)之間像調(diào)用本地方法一樣進(jìn)行調(diào)用。Dubbo 使用 IDL 來(lái)定義服務(wù)接口,并使用各種協(xié)議(如 HTTP、Dubbo 協(xié)議等)進(jìn)行通信。 優(yōu)點(diǎn): 透明化調(diào)用:無(wú)需關(guān)心服務(wù)部署細(xì)節(jié),就像調(diào)用本

    2024年02月19日
    瀏覽(45)
  • Forest-聲明式HTTP客戶(hù)端框架-集成到SpringBoot實(shí)現(xiàn)調(diào)用第三方restful api并實(shí)現(xiàn)接口數(shù)據(jù)轉(zhuǎn)換

    Forest-聲明式HTTP客戶(hù)端框架-集成到SpringBoot實(shí)現(xiàn)調(diào)用第三方restful api并實(shí)現(xiàn)接口數(shù)據(jù)轉(zhuǎn)換

    聲明式HTTP客戶(hù)端API框架,讓Java發(fā)送HTTP/HTTPS請(qǐng)求不再難。它比OkHttp和HttpClient更高層, 是封裝調(diào)用第三方restful api client接口的好幫手,是retrofit和feign之外另一個(gè)選擇。 通過(guò)在接口上聲明注解的方式配置HTTP請(qǐng)求接口。 官網(wǎng): Forest ? 代碼地址: forest: 聲明式HTTP客戶(hù)端API框架,讓

    2024年02月04日
    瀏覽(25)
  • Java Restful API接口獲取請(qǐng)求頭、請(qǐng)求體、以及設(shè)置響應(yīng)狀態(tài)碼、應(yīng)答(響應(yīng))體等

    一、獲取請(qǐng)求頭 接口示例1: 1、從 request?對(duì)象中獲取請(qǐng)求頭: 二、獲取請(qǐng)求體 1、從 request?對(duì)象中,使用緩沖流讀取器、stream流等方式獲取請(qǐng)求體 推薦寫(xiě)法一:

    2024年02月16日
    瀏覽(42)
  • 一站式統(tǒng)一返回值封裝、異常處理、異常錯(cuò)誤碼解決方案—最強(qiáng)的Sping Boot接口優(yōu)雅響應(yīng)處理器

    作者:京東物流?覃玉杰 Graceful Response是一個(gè)Spring Boot體系下的優(yōu)雅響應(yīng)處理器,提供一站式統(tǒng)一返回值封裝、異常處理、異常錯(cuò)誤碼等功能。 使用Graceful Response進(jìn)行web接口開(kāi)發(fā)不僅可以節(jié)省大量的時(shí)間,還可以提高代碼質(zhì)量,使代碼邏輯更清晰。 強(qiáng)烈推薦你花3分鐘學(xué)會(huì)它!

    2024年02月03日
    瀏覽(23)
  • springboot全局統(tǒng)一返回處理

    項(xiàng)目中一般都會(huì)有規(guī)定好的接口返回格式,無(wú)論成功與失敗,一般格式都是不變的,這樣是為了方便前后端統(tǒng)一處理,今天就來(lái)說(shuō)下前后端統(tǒng)一處理的較為優(yōu)雅的方式; 一般而言都會(huì)有一個(gè)統(tǒng)一的返回類(lèi)作為接口的返回?cái)?shù)據(jù)的封裝,例如: 然后我們通過(guò)此類(lèi)作為返回參數(shù)的統(tǒng)一封裝

    2024年02月13日
    瀏覽(21)
  • 【規(guī)范】SpringBoot接口返回結(jié)果及異常統(tǒng)一處理,這樣封裝才優(yōu)雅

    【規(guī)范】SpringBoot接口返回結(jié)果及異常統(tǒng)一處理,這樣封裝才優(yōu)雅

    博友的需求就是我最大的動(dòng)力 博友一說(shuō)話(huà),本狗笑哈哈。 博友要我寫(xiě)啥,我就寫(xiě)啥 。 特來(lái)一篇關(guān)于 SpringBoot接口返回結(jié)果及異常統(tǒng)一處理 ,雖說(shuō)封不封裝都能用,但咱后端也得給前端小姐姐留個(gè)好印象不是。項(xiàng)目前后端分離, 規(guī)范的數(shù)據(jù)傳輸格式,讓REST風(fēng)格的API具有簡(jiǎn)單

    2024年02月08日
    瀏覽(27)
  • SpringBoot生成RESTful API文檔

    SpringBoot生成RESTful API文檔

    由于我一開(kāi)始學(xué)習(xí)的SpringBoot是3以上版本,所以我這里用到的也是支持和SpringBoot3能夠整合的SpringDoc 這里先說(shuō)一下,其實(shí)SpringDoc就是Swagger3版本,我一開(kāi)始整合的2版本,比較麻煩況且最后SpringBoot程序都啟動(dòng)不了了,后面查資料才看到SpringDoc,好使的一批!! 官網(wǎng)地址:http:

    2024年02月08日
    瀏覽(36)
  • SpringBoot 全局異常統(tǒng)一處理:BindException(綁定異常)

    SpringBoot 全局異常統(tǒng)一處理:BindException(綁定異常)

    在Spring Boot應(yīng)用中,數(shù)據(jù)綁定是一個(gè)至關(guān)重要的環(huán)節(jié),它負(fù)責(zé)將HTTP請(qǐng)求中的參數(shù)映射到控制器方法的入?yún)?duì)象上。在這個(gè)過(guò)程中如果遇到問(wèn)題,如參數(shù)缺失、類(lèi)型不匹配或驗(yàn)證失敗等,Spring MVC將會(huì)拋出一個(gè) org.springframework.validation.BindException 異常。本文將深入解析 BindExceptio

    2024年01月18日
    瀏覽(19)
  • Node后端框架Express與Koa接口統(tǒng)一響應(yīng)封裝

    Node后端框架Express與Koa接口統(tǒng)一響應(yīng)封裝

    以前在寫(xiě) SpringBoot 全棧開(kāi)發(fā)的系列文章中全棧開(kāi)發(fā)之后端腳手架:SpringBoot集成MybatisPlus代碼生成,分頁(yè),雪花算法,統(tǒng)一響應(yīng),異常攔截,Swagger3接口文檔,有提到對(duì)后端接口的響應(yīng)數(shù)據(jù)進(jìn)行統(tǒng)一的封裝,方便前端或者第三方進(jìn)行數(shù)據(jù)獲取與對(duì)接工作;統(tǒng)一響應(yīng)一般包含狀態(tài)

    2024年02月05日
    瀏覽(30)
  • 【Go Web開(kāi)發(fā)】Web初識(shí)、RESTful架構(gòu)和RESTful API詳解、Gin框架的安裝和簡(jiǎn)單使用

    【Go Web開(kāi)發(fā)】Web初識(shí)、RESTful架構(gòu)和RESTful API詳解、Gin框架的安裝和簡(jiǎn)單使用

    博主簡(jiǎn)介: 努力學(xué)習(xí)的大一在校計(jì)算機(jī)專(zhuān)業(yè)學(xué)生,熱愛(ài)學(xué)習(xí)和創(chuàng)作。目前在學(xué)習(xí)和分享:數(shù)據(jù)結(jié)構(gòu)、Go,Java等相關(guān)知識(shí)。 博主主頁(yè): @是瑤瑤子啦 所屬專(zhuān)欄: Go語(yǔ)言核心編程 近期目標(biāo): 寫(xiě)好專(zhuān)欄的每一篇文章 全稱(chēng): “萬(wàn)維網(wǎng)”(World Wide Web) 本質(zhì): 系統(tǒng)(基于互聯(lián)網(wǎng)).

    2024年02月03日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包