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

Spring注解@RestControllerAdvice原理解析

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

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

前言

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

用法

首先定義返回對(duì)象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;
  }
}

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

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;
}

下面是自定義的異常類(lèi)

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修飾的類(lèi)

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;
  }
  // 報(bào)StaffPointException時(shí),對(duì)其進(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)行代碼時(shí),如果出現(xiàn)了StaffPointException,那么就會(huì)被攔截進(jìn)入第27行的方法(就是說(shuō)可以自由的在業(yè)務(wù)代碼里往外throw自定義異常了);如果出現(xiàn)了其他的異常,則進(jìn)入18行的方法,統(tǒng)一返回。

驗(yàn)證一下,在代碼里造一個(gè)NPE異常時(shí),返回結(jié)果:

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

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

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

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

小結(jié)

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

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

相關(guān)文章

  • IntelliJ?IDEA?2022.2.3最新激活圖文教程(親測(cè)有用永久激活)

    IntelliJ?IDEA?2022.2.3最新激活圖文教程(親測(cè)有用永久激活)

    今天給大家分享一個(gè)?IDEA?2022.2.3?的激活破解教程,全文通過(guò)文字+圖片的方式講解,手把手教你如何激活破解?IDEA,?只需要幾分鐘即可搞定,對(duì)idea2022.2.3激活碼感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • springboot2.0和springcloud Finchley版項(xiàng)目搭建(包含eureka,gateWay,F(xiàn)reign,Hystrix)

    springboot2.0和springcloud Finchley版項(xiàng)目搭建(包含eureka,gateWay,F(xiàn)re

    這篇文章主要介紹了springboot2.0和springcloud Finchley版項(xiàng)目搭建(包含eureka,gateWay,F(xiàn)reign,Hystrix),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • IDEA 2020代碼提示忽略大小寫(xiě)的問(wèn)題

    IDEA 2020代碼提示忽略大小寫(xiě)的問(wèn)題

    這篇文章主要介紹了IDEA 2020代碼提示忽略大小寫(xiě)的問(wèn)題,本文通過(guò)圖文并茂的形式給大家分享解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • JavaCV實(shí)現(xiàn)圖片中人臉檢測(cè)的示例代碼

    JavaCV實(shí)現(xiàn)圖片中人臉檢測(cè)的示例代碼

    這篇文章主要介紹了如何利用JavaCV實(shí)現(xiàn)圖片中人臉檢測(cè)的功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的可以了解一下
    2022-11-11
  • 5個(gè)步驟讓你明白多線(xiàn)程和線(xiàn)程安全

    5個(gè)步驟讓你明白多線(xiàn)程和線(xiàn)程安全

    本文詳細(xì)講解了多線(xiàn)程和線(xiàn)程安全的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • SpringBoot集成RbbitMQ隊(duì)列踩坑記錄

    SpringBoot集成RbbitMQ隊(duì)列踩坑記錄

    這篇文章主要介紹了SpringBoot集成RbbitMQ隊(duì)列踩坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Spring Security+Spring Data Jpa如何進(jìn)行安全管理

    Spring Security+Spring Data Jpa如何進(jìn)行安全管理

    這篇文章主要介紹了Spring Security+Spring Data Jpa如何進(jìn)行安全管理,幫助大家更好的理解和學(xué)習(xí)Spring Security框架,感興趣的朋友可以了解下
    2020-09-09
  • Springboot打印接口的三種方式分享

    Springboot打印接口的三種方式分享

    這篇文章主要為大家詳細(xì)介紹了Springboot打印接口的三種方式:aop切面的方式、過(guò)濾器的方式和攔截器的方式,感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-08-08
  • java 動(dòng)態(tài)生成SQL的實(shí)例講解

    java 動(dòng)態(tài)生成SQL的實(shí)例講解

    下面小編就為大家?guī)?lái)一篇java 動(dòng)態(tài)生成SQL的實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • Spring實(shí)戰(zhàn)之方法級(jí)別緩存用法示例

    Spring實(shí)戰(zhàn)之方法級(jí)別緩存用法示例

    這篇文章主要介紹了Spring實(shí)戰(zhàn)之方法級(jí)別緩存用法,結(jié)合實(shí)例形式分析了spring方法級(jí)別緩存配置、屬性文件、領(lǐng)域模型及相關(guān)使用技巧,需要的朋友可以參考下
    2020-01-01

最新評(píng)論