Spring注解@RestControllerAdvice原理解析
這篇文章主要介紹了Spring注解@RestControllerAdvice原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
前言
前段時(shí)間部門搭建新系統(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;
}
}
然后定義返回碼的枚舉類,此處只定義了兩種,有需要可以往下添加很多。
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;
}
// 報(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í)將類掃描進(jìn)容器,出異常后,在DispatcherServlet類的doDispatch方法中調(diào)用了對(duì)異常的攔截處理。
小結(jié)
看@RestControllerAdvice源碼可以知道,它就是@ControllerAdvice和@ResponseBody的合并。此注解通過(guò)對(duì)異常的攔截實(shí)現(xiàn)的統(tǒng)一異常返回處理,如果大家在項(xiàng)目中有類似的需求,不妨試一下,好用又方便。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- springboot @Controller和@RestController的區(qū)別及應(yīng)用詳解
- SpringBoot http請(qǐng)求注解@RestController原理解析
- SpringBoot的@RestControllerAdvice作用詳解
- SpringBoot常用注解@RestControllerAdvice詳解
- Spring中@RestControllerAdvice注解的使用詳解
- Spring中的@RestController注解詳細(xì)解析
- Spring @RestController注解組合實(shí)現(xiàn)方法解析
- springboot中@RestController注解實(shí)現(xiàn)
- Spring中@RestController注解的使用實(shí)現(xiàn)
相關(guān)文章
Java import導(dǎo)入及訪問(wèn)控制權(quán)限修飾符原理解析
這篇文章主要介紹了Java import導(dǎo)入及訪問(wèn)控制權(quán)限修飾符過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
SpringBoot實(shí)現(xiàn)WebSocket即時(shí)通訊的示例代碼
本文主要介紹了SpringBoot實(shí)現(xiàn)WebSocket即時(shí)通訊的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
Java報(bào)錯(cuò)org.hibernate.TypeMismatchException的解決方法
在Java開(kāi)發(fā)領(lǐng)域,尤其是涉及到數(shù)據(jù)持久化的項(xiàng)目中,Hibernate是一款廣泛使用的強(qiáng)大工具,然而,可能會(huì)在使用過(guò)程中遭遇各種報(bào)錯(cuò),其中org.hibernate.TypeMismatchException就是一個(gè)讓人頭疼的問(wèn)題,下面我們一起深入剖析這個(gè)報(bào)錯(cuò)信息2024-11-11
SpringBoot中使用Session共享實(shí)現(xiàn)分布式部署的示例代碼
這篇文章主要介紹了SpringBoot中使用Session共享實(shí)現(xiàn)分布式部署的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
解析Java的設(shè)計(jì)模式編程之解釋器模式的運(yùn)用
這篇文章主要介紹了解析Java的設(shè)計(jì)模式編程之解釋器模式的運(yùn)用,文中對(duì)解釋器模式的優(yōu)缺點(diǎn)及適用場(chǎng)景作出了分析,需要的朋友可以參考下2016-02-02
Java反轉(zhuǎn)字符串和相關(guān)字符編碼的問(wèn)題解決
反轉(zhuǎn)字符串一直被當(dāng)作是簡(jiǎn)單問(wèn)題,大家的思想主要就是利用遍歷,首尾交換字符實(shí)現(xiàn)字符串的反轉(zhuǎn)。例如下面的代碼,就可以簡(jiǎn)單實(shí)現(xiàn)反轉(zhuǎn)。2013-05-05

