最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解java封裝返回結(jié)果與RestControllerAdvice注解

 更新時間:2022年09月15日 14:49:15   作者:bluesky  
這篇文章主要為大家介紹了java封裝返回結(jié)果與RestControllerAdvice注解實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

1.為什么要把結(jié)果封裝成統(tǒng)一格式?

異常和正常情況無法區(qū)分:異常情況返回數(shù)據(jù)為null,正常情況下查詢結(jié)果也為null,返回給前端無法區(qū)分

顯示拋出異常信息:前端需要顯示拋出的異常信息

@AllArgsConstructor
public enum ResultCode {
    CODE_200(200, "success"),
    CODE_1000(1000, "fail");
    @Getter
    private Integer code;
    @Getter
    private String msg;
}
@Data
public class Result<T> {
    private String msg;
    private Integer code;
    private T data;
    private Result(String msg, Integer code) {
        this.msg = msg;
        this.code = code;
    }
    private Result(ResultCode resultCode, String msg) {
        this(msg, resultCode.getCode());
    }
    private Result(ResultCode resultCode) {
        this(resultCode.getMsg(), resultCode.getCode());
    }
    public static <T>Result<T> result(ResultCode resultCode,T data) {
        Result result = new Result(resultCode);
        result.setData(data);
        return result;
    }
    public static <T>Result<T> fail(ResultCode resultCode,String message) {
        Result result = new Result(resultCode, message);
        result.setData(null);
        return result;
    }
    public static <T>Result<T> fail(T data) {
        Result result = new Result(ResultCode.CODE_1000);
        result.setData(data);
        return result;
    }
    public static <T>Result<T> success(T data) {
        Result result = new Result(ResultCode.CODE_200);
        result.setData(data);
        return result;
    }
}

不封裝:

封裝:

2.統(tǒng)一異常接收

為什么要用統(tǒng)一異常接收?

通常在service層拋異常,涉及到事務(wù)時不會進行try-catch,需要在controller里處理異常。即使能夠進行try-catch的地方也需要統(tǒng)一返回格式,造成重復(fù)代碼很多,可讀性比較差。

如何實現(xiàn)統(tǒng)一的異常接收?

@Slf4j
@RestControllerAdvice
public class GlobalException {
    @ExceptionHandler(Exception.class)
    public Result<?> handlerException(Exception exception) {
        log.info("Exception異常信息:" + exception.getMessage());
        return Result.fail(ResultCode.CODE_1000, exception.getMessage());
    }
    @ExceptionHandler(value = {MyException.class})
    public Result<?> handlerMyException(Exception exception) {
        log.info("MyException異常信息:" + exception.getMessage());
        return Result.fail(ResultCode.CODE_1000, exception.getMessage());
    }
}

拋出異常后,會進入到@RestControllerAdvice注解的方法,過濾出和拋出異常相同的class的方法,執(zhí)行相應(yīng)的方法。

protected ModelAndView doResolveHandlerMethodException(HttpServletRequest request, HttpServletResponse response, @Nullable HandlerMethod handlerMethod, Exception exception) {
    //根據(jù)異常類型過濾方法
    ServletInvocableHandlerMethod exceptionHandlerMethod = this.getExceptionHandlerMethod(handlerMethod, exception);
    if (exceptionHandlerMethod == null) {
        return null;
    } else {
        if (this.argumentResolvers != null) {
            exceptionHandlerMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        if (this.returnValueHandlers != null) {
            exceptionHandlerMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        ServletWebRequest webRequest = new ServletWebRequest(request, response);
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        ArrayList<Throwable> exceptions = new ArrayList();
        try {
            if (this.logger.isDebugEnabled()) {
                this.logger.debug("Using @ExceptionHandler " + exceptionHandlerMethod);
            }
            Throwable cause;
            for(Throwable exToExpose = exception; exToExpose != null; exToExpose = cause != exToExpose ? cause : null) {
                exceptions.add(exToExpose);
                cause = ((Throwable)exToExpose).getCause();
            }
            Object[] arguments = new Object[exceptions.size() + 1];
            exceptions.toArray(arguments);
            arguments[arguments.length - 1] = handlerMethod;
            //執(zhí)行方法
            exceptionHandlerMethod.invokeAndHandle(webRequest, mavContainer, arguments);
        } catch (Throwable var13) {
            if (!exceptions.contains(var13) && this.logger.isWarnEnabled()) {
                this.logger.warn("Failure in @ExceptionHandler " + exceptionHandlerMethod, var13);
            }
            return null;
        }
        if (mavContainer.isRequestHandled()) {
            return new ModelAndView();
        } else {
            ModelMap model = mavContainer.getModel();
            HttpStatus status = mavContainer.getStatus();
            ModelAndView mav = new ModelAndView(mavContainer.getViewName(), model, status);
            mav.setViewName(mavContainer.getViewName());
            if (!mavContainer.isViewReference()) {
                mav.setView((View)mavContainer.getView());
            }
            if (model instanceof RedirectAttributes) {
                Map<String, ?> flashAttributes = ((RedirectAttributes)model).getFlashAttributes();
                RequestContextUtils.getOutputFlashMap(request).putAll(flashAttributes);
            }
            return mav;
        }
    }
}
protected ServletInvocableHandlerMethod getExceptionHandlerMethod(@Nullable HandlerMethod handlerMethod, Exception exception) {
    Class<?> handlerType = null;
    if (handlerMethod != null) {
        handlerType = handlerMethod.getBeanType();
        ExceptionHandlerMethodResolver resolver = (ExceptionHandlerMethodResolver)this.exceptionHandlerCache.get(handlerType);
        if (resolver == null) {
            resolver = new ExceptionHandlerMethodResolver(handlerType);
            this.exceptionHandlerCache.put(handlerType, resolver);
        }
        Method method = resolver.resolveMethod(exception);
        if (method != null) {
            return new ServletInvocableHandlerMethod(handlerMethod.getBean(), method, this.applicationContext);
        }
        if (Proxy.isProxyClass(handlerType)) {
            handlerType = AopUtils.getTargetClass(handlerMethod.getBean());
        }
    }
    //初始化的時候已經(jīng)將beanType作為key,標(biāo)注@ExceptionHandler的方法包裝成resolve作為value放到exceptionHandlerAdviceCache中
    Iterator var9 = this.exceptionHandlerAdviceCache.entrySet().iterator();
    while(var9.hasNext()) {
        Map.Entry<ControllerAdviceBean, ExceptionHandlerMethodResolver> entry = (Map.Entry)var9.next();
        ControllerAdviceBean advice = (ControllerAdviceBean)entry.getKey();
        if (advice.isApplicableToBeanType(handlerType)) {
            ExceptionHandlerMethodResolver resolver = (ExceptionHandlerMethodResolver)entry.getValue();
            //根據(jù)class進行篩選
            Method method = resolver.resolveMethod(exception);
            if (method != null) {
                return new ServletInvocableHandlerMethod(advice.resolveBean(), method, this.applicationContext);
            }
        }
    }
    return null;
}

直接在service層拋出異常,controller中返回正常的結(jié)果,由標(biāo)注了@RestControllerAdvice的類對異常進行處理

@RestController
@RequestMapping("/user")
public class UserController {
    @GetMapping("/test")
    public Result<Boolean> testGlobalException() {
        globalException.throwException();
        return Result.success(Boolean.TRUE);
    }
}

以上就是詳解java封裝返回結(jié)果與RestControllerAdvice注解的詳細內(nèi)容,更多關(guān)于java RestControllerAdvice 封裝返回的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java定時器Timer與TimerTask的使用詳解

    Java定時器Timer與TimerTask的使用詳解

    這篇文章主要介紹了Java定時器Timer與TimerTask的使用詳解,在JDK類庫中Timer主要負責(zé)計劃任務(wù)的功能,也就是在指定時間執(zhí)行某一任務(wù),執(zhí)行時候會在主線程之外起一個單獨的線程執(zhí)行指定的任務(wù),該類主要是設(shè)置任務(wù)計劃,但封裝的類是TimerTask類,需要的朋友可以參考下
    2023-10-10
  • 23種設(shè)計模式(19)java責(zé)任鏈模式

    23種設(shè)計模式(19)java責(zé)任鏈模式

    這篇文章主要為大家詳細介紹了23種設(shè)計模式之java責(zé)任鏈模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 如何修改覆蓋spring boot默認日志策略logback詳解

    如何修改覆蓋spring boot默認日志策略logback詳解

    這篇文章主要給大家介紹了關(guān)于如何修改覆蓋spring boot默認日志策略logback的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • Mybatis調(diào)用Oracle存儲過程的方法圖文詳解

    Mybatis調(diào)用Oracle存儲過程的方法圖文詳解

    這篇文章主要介紹了Mybatis調(diào)用Oracle存儲過程的方法介紹,需要的朋友可以參考下
    2017-09-09
  • java多線程之定時器Timer的使用詳解

    java多線程之定時器Timer的使用詳解

    本篇文章主要介紹了java多線程之定時器Timer的使用詳解,Time類主要負責(zé)完成定時計劃任務(wù)的功能,有興趣的可以了解一下。
    2017-04-04
  • java發(fā)起http請求調(diào)用post與get接口的方法實例

    java發(fā)起http請求調(diào)用post與get接口的方法實例

    在實際開發(fā)過程中,我們經(jīng)常需要調(diào)用對方提供的接口或測試自己寫的接口是否合適,下面這篇文章主要給大家介紹了關(guān)于java發(fā)起http請求調(diào)用post與get接口的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • java.lang.OutOfMemoryError: Java heap space錯誤的問題解決

    java.lang.OutOfMemoryError: Java heap space錯誤

    本文主要介紹了java.lang.OutOfMemoryError: Java heap space錯誤的問題解決,包括內(nèi)存泄漏、數(shù)據(jù)過大和JVM堆大小配置不足,提供了解決方法,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • Java中如何獲取文件的上級目錄

    Java中如何獲取文件的上級目錄

    這篇文章主要介紹了Java中如何獲取文件的上級目錄問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • java啟動命令中-D和--的區(qū)別解析

    java啟動命令中-D和--的區(qū)別解析

    在 SpringBoot 項目中,啟動時,通過 -D 或 -- 添加參數(shù),都可以直接覆蓋 yml 或 properties 配置文件中的同名配置,如果不存在則相當(dāng)于添加了一個配置,這篇文章主要介紹了java啟動命令中-D和--的區(qū)別,需要的朋友可以參考下
    2024-08-08
  • java數(shù)組、泛型、集合在多態(tài)中的使用及對比

    java數(shù)組、泛型、集合在多態(tài)中的使用及對比

    本文主要介紹了java數(shù)組、泛型、集合在多態(tài)中的使用及對比。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-03-03

最新評論

习水县| 梅河口市| 襄汾县| 盐城市| 禄丰县| 乌兰浩特市| 西城区| 南乐县| 九江市| 黄梅县| 峨眉山市| 沭阳县| 唐山市| 翁牛特旗| 庆云县| 伊川县| 资中县| 佳木斯市| 广德县| 望都县| 子长县| 温宿县| 赫章县| 涟源市| 信阳市| 永康市| 武威市| 海晏县| 团风县| 乳源| 高唐县| 花莲市| 千阳县| 揭阳市| 扶风县| 枣庄市| 凉山| 石城县| 博客| 滁州市| 海原县|