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

springboot的@RestControllerAdvice作用和捕獲自定義異常返回自定義結(jié)果案例

這篇具有很好參考價(jià)值的文章主要介紹了springboot的@RestControllerAdvice作用和捕獲自定義異常返回自定義結(jié)果案例。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、@RestControllerAdvice是什么?

@RestContrllerAdvice是一種組合注解,由@ControllerAdvice,@ResponseBody組成

@ControllerAdvice繼承了@Component,反過來,可以理解為@RestContrllerAdvice本質(zhì)上就是@Component

1.1 @Component是什么?

本質(zhì)上是一個(gè)類,泛指各種組件,就是說當(dāng)我們的類不屬于各種歸類的時(shí)候(不屬于@Controller,@Service等的時(shí)候),我們就可以使用@Component

作用就是實(shí)現(xiàn)bean注入,利用這個(gè)注解可以取代spring的xml配置文件

1.2 @Component案例

1.2.1 準(zhǔn)備的jar

 ? ? ? ? <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>

1.2.2 controller

@RestController
public class TestController {

    @Autowired
    private TestService testService;

    @GetMapping("/test3")
    public String test3() {
        return testService.test();
    }
}

1.2.3 接口

public interface TestService {
    
    String test();
}

1.2.4組件

@Component
public class TestServiceImpl implements TestService {

    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public String test() {
        String b = null;
        try {
            b =  objectMapper.writeValueAsString("a");
            System.out.println(b);
        } catch (Exception e) {
        }
        return b;
    }
}

二、@RestControllerAdvice有什么作用?

  1. 自定義客戶端返回格式

  1. 捕獲客戶端返回異常

三、@RestControllerAdvice案例和使用場(chǎng)景

捕獲客戶端返回異常案例(自定義返回異常)

3.1 未自定義捕獲異常之前

restcontrolleradvice,spring boot,spring,java,Powered by 金山文檔

3.2 自定義捕獲異常以后

restcontrolleradvice,spring boot,spring,java,Powered by 金山文檔

3.3代碼實(shí)現(xiàn)自定義捕獲異常

3.3.1 自定義異常枚舉

public interface BaseCodeMsg {

    String getCode();

    String getMsg();
}
public enum PlatformExceptionMsgEnum implements BaseCodeMsg {

    /**
     * base平臺(tái)返回的異常信息
     */
    SELECT_NULL("000000001", "查詢數(shù)據(jù)為空"),
    INVOKE_IS_REJECT("00000002", "請(qǐng)求被拒絕"),
    ILLEGAL_ARGUMENT_FORMAT("000000003", "非法參數(shù)格式"),
    ILLEGAL_ARGUMENT("000000004","數(shù)據(jù)非法"),
    SYSTEM_EXCEPTION("000000005", "系統(tǒng)異常");

    /**
     * 錯(cuò)誤碼
     */
    private final String code;

    /**
     * 錯(cuò)誤信息
     */
    private final String msg;

    PlatformExceptionMsgEnum(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    @Override
    public String getCode() {
        return code;
    }

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


}

3.3.2 自定義平臺(tái)異常

public abstract class AbstractApiException extends RuntimeException{

    public AbstractApiException() {

    }

    public abstract String getCode();

    public abstract String getMsg();
}
public class PlatformException extends AbstractApiException {

    private String code;

    private String msg;

    public PlatformException(BaseCodeMsg baseCodeMsg) {
        code = baseCodeMsg.getCode();
        msg = baseCodeMsg.getMsg();
    }

    public static void throwException(BaseCodeMsg baseCodeMsg) {
        throw new PlatformException(baseCodeMsg.getCode(), baseCodeMsg.getMsg());
    }

    public static void throwException(BaseCodeMsg baseCodeMsg, String msg) {
        throw new PlatformException(baseCodeMsg.getCode(), StringUtils.isEmpty(baseCodeMsg.getMsg()) ? msg : baseCodeMsg.getMsg());
    }

    public static void throwException(String code, String msg) {
        throw new PlatformException(code, msg);
    }

    public static void throwException(String msg) {
        throw new PlatformException(PlatformExceptionMsgEnum.SYSTEM_EXCEPTION.getCode(), msg);
    }

    public PlatformException(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    @Override
    public String getCode() {
        return code;
    }

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

3.3.3 自定義返回類

@Data
public class BaseResult<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    private String code;

    private String msg;

    private String traceId;

    private T data;

    public boolean isSuccess() {
        return PlatformExceptionMsgEnum.SUCCESS.getCode().equals(this.code);
    }
    public static BaseResult ok() {
        return restBaseResult((Object)null, PlatformExceptionMsgEnum.SUCCESS);
    }

    public static <T> BaseResult<T> ok(T data) {
        return restBaseResult(data, PlatformExceptionMsgEnum.SUCCESS);
    }

    public static BaseResult fail() {
        return restBaseResult((Object)null, PlatformExceptionMsgEnum.SYSTEM_ERROR);
    }

    public static BaseResult fail(BaseCodeMsg baseCodeMsg) {
        return restBaseResult((Object)null, baseCodeMsg);
    }

    public static BaseResult fail(String code, String msg) {
        return restBaseResult((Object)null, code, msg);
    }


    private static <T> BaseResult<T> restBaseResult(T data, BaseCodeMsg baseCodeMsg) {
        return restBaseResult(data, baseCodeMsg.getCode(), baseCodeMsg.getMsg());
    }

    private static <T> BaseResult<T> restBaseResult(T data, String code, String msg) {
        BaseResult<T> apiBaseResult = new BaseResult();
        apiBaseResult.setCode(code);
        apiBaseResult.setData(data);
        apiBaseResult.setMsg(msg);
        apiBaseResult.setTraceId(MDC.get("traceId"));
        return apiBaseResult;
    }

    public BaseResult() {
    }
}

3.3.4 controller層

@RestController
public class TestController {

    @GetMapping("/test")
    public void test() {
        PlatformException.throwException(PlatformExceptionMsgEnum.SYSTEM_EXCEPTION);
    }

}

3.3.5 @RestControllerAdvice

@RestControllerAdvice
@Configuration
public class GlobalExceptionHandler {
    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    private MessageSource messageSource;


    /**
     * 捕獲全局異常類
     *
     * @param e
     * @return
     */
    @ExceptionHandler({MethodArgumentNotValidException.class})
    public BaseResult handle(MethodArgumentNotValidException e) {
        if (e.getBindingResult().hasErrors()) {
            String msg = ((ObjectError) e.getBindingResult().getAllErrors().get(0)).getDefaultMessage();
            return BaseResult.fail(PlatformExceptionMsgEnum.ILLEGAL_ARGUMENT.getCode(), this.getI18nMsg(msg));
        } else {
            log.info(e.getMessage(), e);
            return BaseResult.fail(PlatformExceptionMsgEnum.ILLEGAL_ARGUMENT.getCode(), this.getI18nMsg(PlatformExceptionMsgEnum.ILLEGAL_ARGUMENT.getMsg()));
        }
    }


    /**
     * 捕獲API調(diào)用接口的異常類
     *
     * @param e
     * @return
     */
    @ExceptionHandler(AbstractApiException.class)
    public BaseResult abstractApiException(AbstractApiException e) {
        return BaseResult.fail(e.getCode(), e.getMsg());
    }

    /**
     * 前端傳入的參數(shù)和后端傳入的參數(shù)接收不匹配
     *
     * @param e
     * @return
     */
    @ExceptionHandler({HttpMessageNotReadableException.class})
    public BaseResult handle(HttpMessageNotReadableException e) {
        log.warn(e.getMessage(), e);
        return BaseResult.fail(PlatformExceptionMsgEnum.ILLEGAL_ARGUMENT_FORMAT.getCode(), this.getI18nMsg(PlatformExceptionMsgEnum.ILLEGAL_ARGUMENT_FORMAT.getMsg()));
    }

    /**
     * 子類異常(相當(dāng)于子類不能拋出比父類更廣泛異常)
     *
     * @param e
     * @return
     */
    @ExceptionHandler({UndeclaredThrowableException.class})
    public BaseResult handle(UndeclaredThrowableException e) {
        log.warn(e.getMessage(), e);
        return BaseResult.fail(PlatformExceptionMsgEnum.INVOKE_IS_REJECT.getCode(), this.getI18nMsg(PlatformExceptionMsgEnum.INVOKE_IS_REJECT.getMsg()));
    }

    /**
     * 異常捕獲
     *
     * @param e 捕獲的異常,封裝返回的對(duì)象
     * @return
     */
    @ExceptionHandler(Exception.class)
    public BaseResult handleException(Exception e) {
        log.warn(e.getMessage(), e);
        StringJoiner joiner = new StringJoiner(":");
        joiner.add(this.getI18nMsg(PlatformExceptionMsgEnum.INVOKE_IS_REJECT.getMsg())).add(e.getMessage());
        return BaseResult.fail(PlatformExceptionMsgEnum.SYSTEM_EXCEPTION.getCode(), joiner.toString());
    }

    private String getI18nMsg(String msg) {
        try {
            return this.messageSource.getMessage(msg, (Object[]) null, LocaleContextHolder.getLocale());
        } catch (NoSuchMessageException var3) {
            return msg;
        }
    }

    public GlobalExceptionHandler(MessageSource messageSource) {
        this.messageSource = messageSource;
    }
}

3.4 代碼實(shí)現(xiàn)自定義返回結(jié)果

沒有自定義返回結(jié)果之前

restcontrolleradvice,spring boot,spring,java,Powered by 金山文檔

自定義返回結(jié)果以后

restcontrolleradvice,spring boot,spring,java,Powered by 金山文檔

3.4.1 controller

@RestController
public class TestController {

    @GetMapping("/test2")
    public String test2() {
        return "test2";
    }

}

3.4.2 返回結(jié)果來

BaseResult返回結(jié)果類在上面,對(duì)應(yīng)需要導(dǎo)入json的jar也在上面

3.4.3 @RestControllerAdvice

@RestControllerAdvice(
        annotations = {RestController.class}
)
@Configuration
public class BaseResultResponseAdvice implements ResponseBodyAdvice<Object> {

    @Autowired
    private ObjectMapper objectMapper;

    /**
     * @param methodParameter 利用這個(gè)參數(shù)判斷注解信息
     * @param aClass
     * @return
     */
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }

    /**
     * @param body               原controller需要返回的內(nèi)容
     * @param methodParameter    利用這個(gè)參數(shù)判斷注解信息
     * @param mediaType
     * @param aClass
     * @param serverHttpRequest
     * @param serverHttpResponse
     * @return
     */

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        try {
            if (methodParameter.getParameterType() == ResponseEntity.class) {
                return body;
            } else if (methodParameter.getParameterType() == BaseResult.class) {
                return body;
            } else if (methodParameter.getParameterType() == String.class) {
                serverHttpResponse.getHeaders().setContentType(MediaType.APPLICATION_JSON);
                return this.objectMapper.writeValueAsString(BaseResult.ok(body));
            } else {
                return BaseResult.ok(body);
            }
        } catch (Throwable t) {
            return BaseResult.fail();
        }
    }
}

四、拓展

@RestControllerAdvice的使用還可以指定對(duì)應(yīng)的注解、包,類。比如你需要返回自定義結(jié)果格式,可以指定@RestController層使用,如果你要指定類和包也可以文章來源地址http://www.zghlxwxcb.cn/news/detail-778237.html

4.1 指定注解

@RestControllerAdvice(
        annotations = {RestController.class}
)

4.2 指定類

@RestControllerAdvice(
        basePackageClasses = TestController.class
)

4.3 指定包

@RestControllerAdvice(
        basePackages = "com.common.base.controller"
)

到了這里,關(guān)于springboot的@RestControllerAdvice作用和捕獲自定義異常返回自定義結(jié)果案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(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)文章

  • SpringBoot中@ControllerAdvice/@RestControlAdvice+@ExceptionHandler實(shí)現(xiàn)全局異常捕獲與處理

    SpringBoot中@ControllerAdvice/@RestControlAdvice+@ExceptionHandler實(shí)現(xiàn)全局異常捕獲與處理

    在編寫Controller接口時(shí),為避免接口因?yàn)槲粗漠惓?dǎo)致返回不友好的結(jié)果和提示。 如果不進(jìn)行全局異常捕獲則需要對(duì)每個(gè)接口進(jìn)行try-catch或其他操作。 ? 可以對(duì)Controller進(jìn)行全局的異常捕獲和處理,一旦發(fā)生異常,則返回通用的500響應(yīng)碼與通用錯(cuò)誤提示。 并將異常發(fā)生的具

    2024年02月05日
    瀏覽(24)
  • 【深入解析spring cloud gateway】07 自定義異常返回報(bào)文

    【深入解析spring cloud gateway】07 自定義異常返回報(bào)文

    Servlet的HttpResponse對(duì)象,返回響應(yīng)報(bào)文,一般是這么寫的,通過輸出流直接就可以將返回報(bào)文輸出。 在filter中如果發(fā)生異常(例如請(qǐng)求參數(shù)不合法),拋出異常信息的時(shí)候,調(diào)用方收到的返回碼和body都是Spring Cloud Gateway框架處理來處理的。這一節(jié)我們分析一下,gateway的異常返

    2024年02月10日
    瀏覽(26)
  • springboot優(yōu)雅的統(tǒng)一返回格式 + 全局異常處理(包括404等異常)

    目錄 1.自定義枚舉類 2.自定義統(tǒng)一返回格式類 3.統(tǒng)一返回格式的高級(jí)實(shí)現(xiàn) 4.全局異常處理 5.更優(yōu)雅的全局異常處理 6.處理404錯(cuò)誤 該枚舉類為我們和前端約定好的返回狀態(tài)碼和描述信息,可根據(jù)自己的需求修改狀態(tài)碼和描述 @Data 注解為L(zhǎng)ombok工具類庫(kù)中的注解,提供類的get、s

    2024年02月11日
    瀏覽(27)
  • SpringBoot統(tǒng)一異常處理和統(tǒng)一返回格式

    SpringBoot統(tǒng)一異常處理和統(tǒng)一返回格式

    上篇博客我們講解了使用AOP來進(jìn)行統(tǒng)一的用戶登錄判斷,其實(shí)像這種功能統(tǒng)一且使用較多的地方,都可以用AOP來處理,除了統(tǒng)?的?戶登錄判斷之外,AOP 還可以實(shí)現(xiàn): 統(tǒng)??志記錄 統(tǒng)??法執(zhí)?時(shí)間統(tǒng)計(jì) (在性能優(yōu)化階段,監(jiān)控流量,接口的響應(yīng)時(shí)間等甚至每個(gè)方法的響應(yīng)

    2024年02月15日
    瀏覽(21)
  • SpringBoot統(tǒng)一收集異常信息并返回給前端

    SpringBoot統(tǒng)一收集異常信息并返回給前端

    目錄 適用場(chǎng)景 實(shí)現(xiàn)方法 結(jié)合Servlet對(duì)象 @RestControllerAdvice 通常前后端交互時(shí),后端對(duì)前端參數(shù)進(jìn)行校驗(yàn)后,對(duì)于校驗(yàn)不通過的信息會(huì)自定義一個(gè)異常拋出,但是后端一旦拋出異常,后臺(tái)接口服務(wù)就會(huì)報(bào)500的錯(cuò)誤 對(duì)于有些邏輯錯(cuò)誤而言,我們只是想將此信息提示給用戶,這時(shí)候

    2023年04月08日
    瀏覽(24)
  • 【python基礎(chǔ)】—函數(shù)def()的定義與調(diào)用、參數(shù)、return返回值及變量作用域

    【python基礎(chǔ)】—函數(shù)def()的定義與調(diào)用、參數(shù)、return返回值及變量作用域

    語(yǔ)法: 舉例: 上面我們定義一個(gè)名字為hello的函數(shù),括號(hào)內(nèi)部是函數(shù)接收的參數(shù)name,緊接著就是函數(shù)的功能代碼。 多次調(diào)用 位置參數(shù) 這里的\\\"手拍黃瓜\\\"和\\\"大米飯\\\"是對(duì)應(yīng)參數(shù)appetizer和course的位置順序傳遞的,所以被叫作位置參數(shù),這也是最常見的參數(shù)類型。 默認(rèn)參數(shù) 注意

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

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

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

    2024年02月08日
    瀏覽(27)
  • 05-python之函數(shù)-函數(shù)的定義/函數(shù)的參數(shù)/函數(shù)返回值/函數(shù)說明文檔/函數(shù)的嵌套使用/函數(shù)變量的作用域

    05-python之函數(shù)-函數(shù)的定義/函數(shù)的參數(shù)/函數(shù)返回值/函數(shù)說明文檔/函數(shù)的嵌套使用/函數(shù)變量的作用域

    對(duì)應(yīng)輸出如上,沒有使用len()函數(shù),對(duì)應(yīng)的子算出字符的長(zhǎng)度,但是代碼整體寫的就很別扭。代碼過于重復(fù),代碼中唯一不一樣的地方就是被統(tǒng)計(jì)的字符串不同。同時(shí)對(duì)應(yīng)的,代碼整體也就會(huì)比較低效??梢允褂煤瘮?shù),優(yōu)化過程,先定義函數(shù)。 同樣的輸出,效果一樣,兩者

    2024年01月19日
    瀏覽(80)
  • springboot全局異常處理和自定義異常處理

    在spring項(xiàng)目中,優(yōu)雅處理異常,好處是可以將系統(tǒng)產(chǎn)生的全部異常統(tǒng)一捕獲處理,自定義的異常也由全局異常來捕獲,如果涉及到validator參數(shù)校驗(yàn)器使用全局異常捕獲也是較為方便。 GlobalExceptionHandler類: 自定義異常CustomException類: 通用返回類:AjaxResult 枚舉類ResultCodeEnum:

    2024年02月04日
    瀏覽(16)
  • 【微服務(wù)】Feign 整合 Sentinel,深入探索 Sentinel 的隔離和熔斷降級(jí)規(guī)則,以及授權(quán)規(guī)則和自定義異常返回結(jié)果

    【微服務(wù)】Feign 整合 Sentinel,深入探索 Sentinel 的隔離和熔斷降級(jí)規(guī)則,以及授權(quán)規(guī)則和自定義異常返回結(jié)果

    在前文中,介紹了 Sentinel 的流控模式和流控效果,然而限流只是一種預(yù)防措施,雖然可以盡量避免因?yàn)椴l(fā)問題而引起的服務(wù)故障,但服務(wù)仍然可能因其他因素而發(fā)生故障。為了將這些故障控制在一定范圍內(nèi),以避免雪崩效應(yīng)的發(fā)生,我們需要依賴線程隔離(艙壁模式)和熔

    2024年02月08日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包