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

Spring注解@RestControllerAdvice原理解析

 更新時間:2019年11月18日 09:18:24   作者:張曾經(jīng)  
這篇文章主要介紹了Spring注解@RestControllerAdvice原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

這篇文章主要介紹了Spring注解@RestControllerAdvice原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

前言

前段時間部門搭建新系統(tǒng),需要出異常后統(tǒng)一接口的返回格式,于是用到了Spring的注解@RestControllerAdvice。現(xiàn)在把此注解的用法總結(jié)一下。

用法

首先定義返回對象ResponseDto

package com.staff.points.common;

import lombok.Data;

import java.io.Serializable;

@Data
public class ResponseDto<T> implements Serializable {
  private static final long serialVersionUID = -284719732991678911L;

  private String code;

  private String message;

  private T data;

  public static <T> ResponseDto<T> assemblingSuccessResponse(T data) {
    ResponseDto<T> responseDto = new ResponseDto<>();
    responseDto.setCode(ResponseCodeEnum.SUCCESS.getCode());
    responseDto.setMessage(ResponseCodeEnum.SUCCESS.getMessage());
    responseDto.setData(data);
    return responseDto;
  }

  public static <T> ResponseDto<T> assemblingSuccessResponse() {
    ResponseDto<T> responseDto = new ResponseDto<>();
    responseDto.setCode(ResponseCodeEnum.SUCCESS.getCode());
    responseDto.setMessage(ResponseCodeEnum.SUCCESS.getMessage());
    responseDto.setData(null);
    return responseDto;
  }

  public static <T> ResponseDto<T> assemblingFailureResponse(ResponseCodeEnum data) {
    ResponseDto<T> responseDto = new ResponseDto<>();
    responseDto.setCode(data.FAILURE.getCode());
    responseDto.setMessage(data.FAILURE.getMessage());
    return responseDto;
  }

  public static <T> ResponseDto<T> assemblingFailureResponse() {
    ResponseDto<T> responseDto = new ResponseDto<>();
    responseDto.setCode(ResponseCodeEnum.FAILURE.getCode());
    responseDto.setMessage(ResponseCodeEnum.FAILURE.getMessage());
    return responseDto;
  }
}

然后定義返回碼的枚舉類,此處只定義了兩種,有需要可以往下添加很多。

package com.staff.points.common;

import lombok.AllArgsConstructor;
import lombok.Getter;

@AllArgsConstructor
@Getter
public enum ResponseCodeEnum {
  SUCCESS("00", "成功"),
  FAILURE("01", "系統(tǒng)異常");


  private String code;
  private String message;
}

下面是自定義的異常類

package com.staff.points.common;

import lombok.Data;

@Data
public class StaffPointsException extends RuntimeException{
  private String code;
  private String message;
  public StaffPointsException () {}

  public StaffPointsException (Exception e) {
    super(e);
  }

  public StaffPointsException (String code, String message) {
    super(message);
    this.code = code;
    this.message = message;
  }

  public StaffPointsException (ResponseCodeEnum codeEnum) {
    super(codeEnum.getMessage());
    this.code = codeEnum.getCode();
    this.message = codeEnum.getMessage();
  }
}

然后是關(guān)鍵的@RestControllerAdvice修飾的類

package com.staff.points.exception;

import com.staff.points.common.ResponseCodeEnum;
import com.staff.points.common.ResponseDto;
import com.staff.points.common.StaffPointsException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
@Component
public class UnifyExceptionHandler {
  private Logger logger = LoggerFactory.getLogger(UnifyExceptionHandler.class);

  @ExceptionHandler(Exception.class)
  public ResponseDto handlerCommonException (Exception e) {
    ResponseDto responseDto = new ResponseDto<>();
    responseDto.setCode(ResponseCodeEnum.FAILURE.getCode());
    responseDto.setMessage(ResponseCodeEnum.FAILURE.getMessage());
    logger.info("UnifyExceptionHandler.handlerCommonException exception:" + e);
    return responseDto;
  }
  // 報StaffPointException時,對其進(jìn)行攔截并處理的方法
  @ExceptionHandler(StaffPointsException.class)
  public ResponseDto handlerCustomizeException (StaffPointsException e) {
    ResponseDto responseDto = new ResponseDto<>();
    responseDto.setCode(e.getCode());
    responseDto.setMessage(e.getMessage());
    logger.info("UnifyExceptionHandler.handlerCustomizeException StaffPointsException:" + e);
    return responseDto;
  }
}

運(yùn)行代碼時,如果出現(xiàn)了StaffPointException,那么就會被攔截進(jìn)入第27行的方法(就是說可以自由的在業(yè)務(wù)代碼里往外throw自定義異常了);如果出現(xiàn)了其他的異常,則進(jìn)入18行的方法,統(tǒng)一返回。

驗證一下,在代碼里造一個NPE異常時,返回結(jié)果:

 {
  "code": "01",
  "message": "系統(tǒng)異常",
  "data": null
 }

造一個StaffPointsException異常時,返回結(jié)果:

 {
  "code": "99",
  "message": "自定義業(yè)務(wù)異常",
  "data": null
 }

它的作用原理,大體是先在spring初始化時將類掃描進(jìn)容器,出異常后,在DispatcherServlet類的doDispatch方法中調(diào)用了對異常的攔截處理。

小結(jié)

看@RestControllerAdvice源碼可以知道,它就是@ControllerAdvice和@ResponseBody的合并。此注解通過對異常的攔截實現(xiàn)的統(tǒng)一異常返回處理,如果大家在項目中有類似的需求,不妨試一下,好用又方便。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java import導(dǎo)入及訪問控制權(quán)限修飾符原理解析

    Java import導(dǎo)入及訪問控制權(quán)限修飾符原理解析

    這篇文章主要介紹了Java import導(dǎo)入及訪問控制權(quán)限修飾符過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot實現(xiàn)WebSocket即時通訊的示例代碼

    SpringBoot實現(xiàn)WebSocket即時通訊的示例代碼

    本文主要介紹了SpringBoot實現(xiàn)WebSocket即時通訊的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Java報錯org.hibernate.TypeMismatchException的解決方法

    Java報錯org.hibernate.TypeMismatchException的解決方法

    在Java開發(fā)領(lǐng)域,尤其是涉及到數(shù)據(jù)持久化的項目中,Hibernate是一款廣泛使用的強(qiáng)大工具,然而,可能會在使用過程中遭遇各種報錯,其中org.hibernate.TypeMismatchException就是一個讓人頭疼的問題,下面我們一起深入剖析這個報錯信息
    2024-11-11
  • SpringBoot中使用Session共享實現(xiàn)分布式部署的示例代碼

    SpringBoot中使用Session共享實現(xiàn)分布式部署的示例代碼

    這篇文章主要介紹了SpringBoot中使用Session共享實現(xiàn)分布式部署的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • java中Arthas的作用和使用方式

    java中Arthas的作用和使用方式

    Arthas 是由阿里巴巴開源的 Java 診斷工具,主要用于在生產(chǎn)環(huán)境中診斷和解決 Java 應(yīng)用問題,它提供實時監(jiān)控、類信息查看、動態(tài)追蹤、條件表達(dá)式斷點等功能,支持非侵入式設(shè)計和高擴(kuò)展性,通過 Arthas,開發(fā)者可以在不停止應(yīng)用的情況下,快速定位和解決問題
    2025-01-01
  • 詳解Springboot自定義異常處理

    詳解Springboot自定義異常處理

    本篇文章主要介紹了詳解Springboot自定義異常處理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • 解析Java的設(shè)計模式編程之解釋器模式的運(yùn)用

    解析Java的設(shè)計模式編程之解釋器模式的運(yùn)用

    這篇文章主要介紹了解析Java的設(shè)計模式編程之解釋器模式的運(yùn)用,文中對解釋器模式的優(yōu)缺點及適用場景作出了分析,需要的朋友可以參考下
    2016-02-02
  • Java之ThreadPoolExecutor類詳解

    Java之ThreadPoolExecutor類詳解

    這篇文章主要介紹了Java之ThreadPoolExecutor類詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • SpringBoot自定義starter實例代碼

    SpringBoot自定義starter實例代碼

    這篇文章主要給大家介紹了關(guān)于SpringBoot自定義starter的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java反轉(zhuǎn)字符串和相關(guān)字符編碼的問題解決

    Java反轉(zhuǎn)字符串和相關(guān)字符編碼的問題解決

    反轉(zhuǎn)字符串一直被當(dāng)作是簡單問題,大家的思想主要就是利用遍歷,首尾交換字符實現(xiàn)字符串的反轉(zhuǎn)。例如下面的代碼,就可以簡單實現(xiàn)反轉(zhuǎn)。
    2013-05-05

最新評論