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

spring項(xiàng)目自定義全局響應(yīng)處理器統(tǒng)一處理響應(yīng)結(jié)果的實(shí)現(xiàn)步驟

 更新時(shí)間:2025年01月24日 10:59:19   作者:Java高手馬保國(guó)  
本文詳細(xì)描述了如何通過@ControllerAdvice和ResponseBodyAdvice在SpringMVC項(xiàng)目中創(chuàng)建自定義響應(yīng)處理器,以及如何使用Wrapper類包裝和標(biāo)準(zhǔn)化返回結(jié)果,感興趣的朋友跟隨小編一起看看吧

實(shí)現(xiàn)方式

使用@ControllerAdvice注解和實(shí)現(xiàn)ResponseBodyAdvice接口自定義全局響應(yīng)處理器

實(shí)現(xiàn)步驟

自定義統(tǒng)一返回類

定義統(tǒng)一返回類,包裝返回結(jié)果

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)//過濾null,提高性能
@ApiModel(value = "返回類")
public class Wrapper<T> implements Serializable {
	/**
	 * 成功碼
	 */
	public static final int SUCCESS_CODE = 200;
	/**
	 * 成功信息
	 */
	public static final String SUCCESS_MESSAGE = "操作成功";
	/**
	 * 錯(cuò)誤碼
	 */
	public static final int ERROR_CODE = 500;
	/**
	 * 錯(cuò)誤信息
	 */
	public static final String ERROR_MESSAGE = "內(nèi)部異常";
	/**
	 * 編號(hào)
	 */
	@ApiModelProperty("編號(hào)")
	private int code;
	/**
	 * 信息
	 */
	@ApiModelProperty("信息")
	private String message;
	/**
	 * 結(jié)果數(shù)據(jù)
	 */
	@ApiModelProperty("結(jié)果數(shù)據(jù)")
	private T result;
	/** 為什么使用this替代new類名
	 * 代碼簡(jiǎn)潔:使用 this 可以使得代碼更加簡(jiǎn)潔,因?yàn)槟悴恍枰看味贾貜?fù)使用類的名稱。
	 * 明確性:通過使用 this,你清楚地表明你正在調(diào)用當(dāng)前類的另一個(gè)構(gòu)造函數(shù)或方法,而不是其他類的構(gòu)造函數(shù)或方法。
	 * 減少重復(fù):在多構(gòu)造函數(shù)的類中,如果每個(gè)構(gòu)造函數(shù)都需要設(shè)置相同的屬性,那么使用 this 可以避免重復(fù)代碼。
	 * 提高可讀性:當(dāng)一個(gè)構(gòu)造函數(shù)調(diào)用了另一個(gè)構(gòu)造函數(shù)時(shí),使用 this 可以讓讀者更容易理解正在發(fā)生的事情,尤其是當(dāng)構(gòu)造函數(shù)的參數(shù)不同,但都包含某些共同參數(shù)時(shí)。
	 */
	//默認(rèn)構(gòu)造函數(shù),它直接調(diào)用第二個(gè)構(gòu)造函數(shù),并傳遞 SUCCESS_CODE 和 SUCCESS_MESSAGE 作為參數(shù)。
	Wrapper() {
		this(SUCCESS_CODE, SUCCESS_MESSAGE);
	}
	//不需要返回?cái)?shù)據(jù) 帶有兩個(gè)參數(shù)的構(gòu)造函數(shù),它調(diào)用第三個(gè)構(gòu)造函數(shù),并傳遞相同的參數(shù)。
	Wrapper(int code, String message) {
		this(code, message, null);
	}
	//需要返回?cái)?shù)據(jù)
	Wrapper(int code, String message, T result) {
		super();
		this.code(code).message(message).result(result);
	}
	private Wrapper<T> code(int code) {
		this.setCode(code);
		return this;
	}
	private Wrapper<T> message(String message) {
		this.setMessage(message);
		return this;
	}
	public Wrapper<T> result(T result) {
		this.setResult(result);
		return this;
	}
	@JsonIgnore
	public boolean success() {
		return Wrapper.SUCCESS_CODE == this.code;
	}
	@JsonIgnore
	public boolean error() {
		return !success();
	}
}

定義 統(tǒng)一返回包裝類

public class WrapMapper {
    /**
     * 在 `WrapMapper` 類中,私有構(gòu)造函數(shù)的設(shè)計(jì)是為了防止外部實(shí)例化這個(gè)類。這是一個(gè)常見的做法,有以下幾個(gè)原因:
     * 1. **單一職責(zé)原則**:`WrapMapper` 類被設(shè)計(jì)為一個(gè)工具類,只提供一系列靜態(tài)方法,用于創(chuàng)建和處理 `Wrapper` 對(duì)象。它不包含任何實(shí)例變量,因此它沒有必要被實(shí)例化。
     * 2. **減少依賴**:如果 `WrapMapper` 類可以被實(shí)例化,那么任何使用這個(gè)類的代碼都需要導(dǎo)入這個(gè)類的引用。通過將構(gòu)造函數(shù)設(shè)為私有,你可以限制它的使用,只允許通過靜態(tài)方法來使用這個(gè)類。
     * 3. **提高效率**:工具類通常不需要?jiǎng)?chuàng)建多個(gè)實(shí)例,因?yàn)樗鼈儾灰蕾囉谕獠繝顟B(tài),而且它們的操作通常可以通過靜態(tài)方法完成。因此,設(shè)計(jì)為不可實(shí)例化可以提高效率。
     * 4. **清晰意圖**:通過將構(gòu)造函數(shù)設(shè)為私有,明確地表明這個(gè)類不應(yīng)該被實(shí)例化,這有助于其他開發(fā)者理解這個(gè)類的用途和設(shè)計(jì)意圖。
     * 總之,將 `WrapMapper` 類的構(gòu)造函數(shù)設(shè)為私有是為了遵循單一職責(zé)原則,減少依賴,提高效率,并提高代碼的可讀性和可維護(hù)性。這樣的設(shè)計(jì)有助于確保 `WrapMapper` 類只作為工具類被使用,而不被誤用或?yàn)E用。
     */
    private WrapMapper() {
    }
	public static <E> Wrapper<E> wrap(int code) {
		return wrap(code, null);
	}
	public static <E> Wrapper<E> wrap(int code, String message) {
		return wrap(code, message, null);
	}
    public static <E> Wrapper<E> wrap(int code, String message, E o) {
        return new Wrapper<>(code, message, o);
    }
    public static <E> Wrapper<E> wrap(Exception e) {
        return new Wrapper<>(Wrapper.ERROR_CODE, e.getMessage());
    }
    public static <E> E unWrap(Wrapper<E> wrapper) {
        return wrapper.getResult();
    }
    public static <E> Wrapper<E> error() {
        return wrap(Wrapper.ERROR_CODE, Wrapper.ERROR_MESSAGE);
    }
    public static <E> Wrapper<E> error(int code,String message) {
        return wrap(code, message);
    }
    public static <E> Wrapper<E> error(String message) {
        return wrap(Wrapper.ERROR_CODE, StringUtils.isBlank(message) ? Wrapper.ERROR_MESSAGE : message);
    }
    public static <E> Wrapper<E> ok() {
        return new Wrapper<>();
    }
    public static <E> Wrapper<E> ok(E o) {
        return new Wrapper<>(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, o);
    }
}

定義啟用全局響應(yīng)注解

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

定義忽略全局響應(yīng)注解

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

定義全局響應(yīng)處理器

//@Component標(biāo)記的類,Spring 容器會(huì)自動(dòng)掃描這個(gè)類,并將它作為一個(gè) bean 創(chuàng)建和注冊(cè)到 Spring 容器中。
//可以被其他類通過 @Autowired 注解自動(dòng)裝配,你不需要顯式地定義 bean 的依賴關(guān)系,Spring 容器會(huì)自動(dòng)處理。
@Component
@ControllerAdvice//全局控制器增強(qiáng)
public class GlobalResponseHandler implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        if (methodParameter.getMethod().isAnnotationPresent(IgnoreResponseHandler.class)) {
            return false;
        }
        //只有EnableResponseHandler注解標(biāo)識(shí)的類才會(huì)去調(diào)用beforeBodyWrite方法
        if (methodParameter.getMethod().isAnnotationPresent(EnableResponseHandler.class)) {
            return true;
        }
        if (methodParameter.getDeclaringClass().isAnnotationPresent(EnableResponseHandler.class)) {
            return true;
        }
        return false;
    }
	/**
	*beforeBodyWrite方法在 Spring MVC 將返回的對(duì)象寫入 HTTP 響應(yīng)之前被調(diào)用,它提供了一個(gè)機(jī)會(huì)來增強(qiáng)或修改響應(yīng)體。
	*	作用
	*	1.增強(qiáng)響應(yīng):在返回對(duì)象被寫入響應(yīng)之前,允許你對(duì)響應(yīng)進(jìn)行增強(qiáng)或修改。
	*	自定義格式化:如果你需要對(duì)返回的對(duì)象進(jìn)行特殊的格式化,比如添加額外的頭信息,或者修改對(duì)象的屬性,beforeBodyWrite 提供了這種能力。
	*	全局應(yīng)用:你可以定義多個(gè) ResponseBodyAdvice 實(shí)現(xiàn)類,并將它們應(yīng)用于整個(gè)應(yīng)用程序,或者針對(duì)特定的 Controller 或請(qǐng)求類型進(jìn)行過濾。
	*/
    @Nullable
    @Override
    public Object beforeBodyWrite(@Nullable Object o,
                                  MethodParameter methodParameter,
                                  MediaType mediaType,
                                  Class<? extends HttpMessageConverter<?>> aClass,
                                  ServerHttpRequest serverHttpRequest,
                                  ServerHttpResponse serverHttpResponse) {
        //如果返回的不是自己定義的包裝類
        if (o instanceof Wrapper) {
            return o;
        }
        //使用WrapMapper包裝后返回
        return WrapMapper.ok(o);
    }
}

到此這篇關(guān)于spring項(xiàng)目自定義全局響應(yīng)處理器,統(tǒng)一處理響應(yīng)結(jié)果的文章就介紹到這了,更多相關(guān)spring自定義全局響應(yīng)處理器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA連接mysql數(shù)據(jù)庫報(bào)錯(cuò)的解決方法

    IDEA連接mysql數(shù)據(jù)庫報(bào)錯(cuò)的解決方法

    這篇文章主要介紹了IDEA連接mysql數(shù)據(jù)庫報(bào)錯(cuò)的解決方法,文中有非常詳細(xì)的圖文示例,對(duì)出現(xiàn)Server returns invalid timezone. Go to ‘Advanced‘ tab and set ‘serverTimezone‘ prope報(bào)錯(cuò)的小伙伴們很有幫助喲,需要的朋友可以參考下
    2021-05-05
  • java并發(fā)之Lock接口的深入講解

    java并發(fā)之Lock接口的深入講解

    從Java 5之后,在java.util.concurrent.locks包下提供了另外一種方式來實(shí)現(xiàn)同步訪問.那就是Lock,這篇文章主要給大家介紹了關(guān)于java并發(fā)之Lock接口的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • SpringBoot實(shí)現(xiàn)識(shí)別圖片中的身份證號(hào)與營(yíng)業(yè)執(zhí)照信息

    SpringBoot實(shí)現(xiàn)識(shí)別圖片中的身份證號(hào)與營(yíng)業(yè)執(zhí)照信息

    這篇文章主要為大家詳細(xì)介紹了SpringBoot如何實(shí)現(xiàn)識(shí)別圖片中的身份證號(hào)與營(yíng)業(yè)執(zhí)照信息,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2024-01-01
  • java使用ArrayList實(shí)現(xiàn)斗地主(無序版)

    java使用ArrayList實(shí)現(xiàn)斗地主(無序版)

    這篇文章主要為大家詳細(xì)介紹了java使用ArrayList實(shí)現(xiàn)斗地主,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 排序算法圖解之Java插入排序

    排序算法圖解之Java插入排序

    插入排序是一種最簡(jiǎn)單的排序方法,它的基本思想是將一個(gè)記錄插入到已經(jīng)排好序的有序表中,從而一個(gè)新的、記錄數(shù)增1的有序表。本文通過圖片合示例講解了插入排序的實(shí)現(xiàn),需要的可以了解一下
    2022-11-11
  • 解決HttpPost+json請(qǐng)求---服務(wù)器中文亂碼及其他問題

    解決HttpPost+json請(qǐng)求---服務(wù)器中文亂碼及其他問題

    這篇文章主要介紹了解決HttpPost+json請(qǐng)求---服務(wù)器中文亂碼及其他問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Springboot自帶定時(shí)任務(wù)實(shí)現(xiàn)動(dòng)態(tài)配置Cron參數(shù)方式

    Springboot自帶定時(shí)任務(wù)實(shí)現(xiàn)動(dòng)態(tài)配置Cron參數(shù)方式

    這篇文章主要介紹了Springboot自帶定時(shí)任務(wù)實(shí)現(xiàn)動(dòng)態(tài)配置Cron參數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java中輸出字符的ASCII值實(shí)例

    Java中輸出字符的ASCII值實(shí)例

    這篇文章主要介紹了Java中輸出字符的ASCII值實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java中使用Lambda表達(dá)式和函數(shù)編程示例

    Java中使用Lambda表達(dá)式和函數(shù)編程示例

    這篇文章介紹了Java中使用Lambda表達(dá)式和函數(shù)編程示例,該文章會(huì)演示多個(gè)示列,分別是變量聲明上下文中的lambda、return語句上下文中的lambda、賦值上下文中的lambda、lambda在數(shù)組初始值設(shè)定項(xiàng)上下文中的用法等等,需要的朋友可以參考一下
    2021-10-10
  • Java Spring Boot消息服務(wù)萬字詳解分析

    Java Spring Boot消息服務(wù)萬字詳解分析

    在實(shí)際項(xiàng)目開發(fā)中,有時(shí)需要與其他系統(tǒng)進(jìn)行集成完成相關(guān)業(yè)務(wù)功能,這種情況最原始做法是程序內(nèi)部相互調(diào)用,除此之外,還可以用消息服務(wù)中間件進(jìn)行業(yè)務(wù)處理,用消息服務(wù)中間件處理業(yè)務(wù)能夠提升系統(tǒng)的異步通信和擴(kuò)展解耦能力。Spring Boot對(duì)消息服務(wù)管理提供了非常好的支持
    2021-10-10

最新評(píng)論