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

Spring Cloud Gateway自定義異常處理Exception Handler的方法小結(jié)

 更新時間:2021年08月10日 08:50:26   作者:飛云~風(fēng)之谷  
這篇文章主要介紹了Spring Cloud Gateway自定義異常處理Exception Handler的方法,本文通過兩種方法結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

版本: Spring Cloud 2020.0.3

常見的方法有 實(shí)現(xiàn)自己的 DefaultErrorWebExceptionHandler 或 僅實(shí)現(xiàn)ErrorAttributes.

方法1: ErrorWebExceptionHandler (僅供示意)

自定義一個 GlobalErrorAttributes:

@Component
public class GlobalErrorAttributes extends DefaultErrorAttributes{

    @Override
    public Map<String, Object> getErrorAttributes(ServerRequest request, ErrorAttributeOptions options) {
        Throwable error = super.getError(request);

        Map<String, Object> map = super.getErrorAttributes(request, options);
        map.put("status", HttpStatus.BAD_REQUEST.value());
        map.put("message", error.getMessage());
        return map;
    }
}

實(shí)現(xiàn)一個

@Component
@Order(-2)
public class GlobalErrorWebExceptionHandler extends AbstractErrorWebExceptionHandler {

    public GlobalErrorWebExceptionHandler(GlobalErrorAttributes gea, ApplicationContext applicationContext,
                                          ServerCodecConfigurer serverCodecConfigurer) {
        super(gea, new WebProperties.Resources(), applicationContext);
        super.setMessageWriters(serverCodecConfigurer.getWriters());
        super.setMessageReaders(serverCodecConfigurer.getReaders());
    }

    //渲染html或json
    @Override
    protected RouterFunction<ServerResponse> getRoutingFunction(final ErrorAttributes errorAttributes) {
        return RouterFunctions.route(RequestPredicates.all(), this::renderErrorResponse);
    }

    private Mono<ServerResponse> renderErrorResponse(final ServerRequest request) {

        final Map<String, Object> errorPropertiesMap = getErrorAttributes(request, ErrorAttributeOptions.defaults());

        return ServerResponse.status(HttpStatus.BAD_REQUEST)
                .contentType(MediaType.APPLICATION_JSON)
                .body(BodyInserters.fromValue(errorPropertiesMap));
    }
}

方法2, 僅實(shí)現(xiàn)一個 ErrorAttributes, 以覆蓋默認(rèn)的 DefaultErrorAttributes

//Spring 默認(rèn)的就很好了.
@Component
public class GatewayErrorAttributes extends DefaultErrorAttributes {

    private static final Logger logger = LoggerFactory.getLogger(GatewayErrorAttributes.class);

    @Override
    public Map<String, Object> getErrorAttributes(ServerRequest request,  ErrorAttributeOptions options) {
        Throwable error = super.getError(request);
        Map<String, Object> errorAttributes = new HashMap<>(8);
        errorAttributes.put("message", error.getMessage());
        errorAttributes.put("method", request.methodName());
        errorAttributes.put("path", request.path());

        MergedAnnotation<ResponseStatus> responseStatusAnnotation = MergedAnnotations
                .from(error.getClass(), MergedAnnotations.SearchStrategy.TYPE_HIERARCHY).get(ResponseStatus.class);

        HttpStatus errorStatus = determineHttpStatus(error, responseStatusAnnotation);

        //必須設(shè)置, 否則會報錯, 因為 DefaultErrorWebExceptionHandler 的 renderErrorResponse 方法會獲取此屬性, 重新實(shí)現(xiàn) DefaultErrorWebExceptionHandler也可.
        errorAttributes.put("status", errorStatus.value());
        errorAttributes.put("code", errorStatus.value());

        //html view用
        errorAttributes.put("timestamp", new Date());
        //html view 用
        errorAttributes.put("requestId", request.exchange().getRequest().getId());

        errorAttributes.put("error", errorStatus.getReasonPhrase());
        errorAttributes.put("exception", error.getClass().getName());

        return errorAttributes;
    }

    //從DefaultErrorWebExceptionHandler中復(fù)制過來的
    private HttpStatus determineHttpStatus(Throwable error, MergedAnnotation<ResponseStatus> responseStatusAnnotation) {
        if (error instanceof ResponseStatusException) {
            return ((ResponseStatusException) error).getStatus();
        }
        return responseStatusAnnotation.getValue("code", HttpStatus.class).orElse(HttpStatus.INTERNAL_SERVER_ERROR);
    }
    
}

這樣就可以了.

注意注意: 必須設(shè)置 errorAttributes.put("status", errorStatus.value()) , 否則會報錯, 因為 DefaultErrorWebExceptionHandler 的 renderErrorResponse 方法會獲取此屬性. 除非你自己像方法一一樣重新實(shí)現(xiàn) DefaultErrorWebExceptionHandler.

然后在網(wǎng)關(guān)中訪問一個不存在的服務(wù), 即可看到效果.

curl 'http://127.0.0.1:8900/fundmain22/abc/gogogo?id=1000' --header 'Accept: application/json'
{"exception":"org.springframework.web.server.ResponseStatusException","path":"/fundmain22/abc/gogogo","code":404,"method":"GET","requestId":"094e53e5-1","message":"404 NOT_FOUND","error":"Not Found","status":404,"timestamp":"2021-08-09T11:07:44.106+0000"}

感謝網(wǎng)絡(luò)上的各種文章...

到此這篇關(guān)于Spring Cloud Gateway自定義異常處理Exception Handler的文章就介紹到這了,更多相關(guān)Spring Cloud Gateway自定義異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot中用fastjson處理返回值為null的屬性值

    springboot中用fastjson處理返回值為null的屬性值

    在本篇文章里小編給大家整理的是一篇關(guān)于springboot中用fastjson處理返回值問題詳解內(nèi)容,需要的朋友們參考下。
    2020-03-03
  • Spring jndi數(shù)據(jù)源配置方法詳解

    Spring jndi數(shù)據(jù)源配置方法詳解

    這篇文章主要為大家詳細(xì)介紹了Spring jndi數(shù)據(jù)源的配置方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下解
    2017-07-07
  • 一文了解SpringBoot是如何連接數(shù)據(jù)庫的

    一文了解SpringBoot是如何連接數(shù)據(jù)庫的

    Spring Boot提供了一系列的開箱即用的功能和特性,使得開發(fā)人員可以快速構(gòu)建和部署應(yīng)用程序,下面這篇文章主要給大家介紹了關(guān)于SpringBoot是如何連接數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • js實(shí)現(xiàn)拖拽拼圖游戲

    js實(shí)現(xiàn)拖拽拼圖游戲

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)拖拽拼圖游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Redisson可重入鎖解鎖邏輯詳細(xì)講解

    Redisson可重入鎖解鎖邏輯詳細(xì)講解

    Redisson開源框架是一個Redis的分布式鎖的現(xiàn)成實(shí)現(xiàn)方案,是Redis的java實(shí)現(xiàn)的客戶端。通過Netty支持非阻塞I/O。Redisson實(shí)現(xiàn)了分布式鎖的自動續(xù)期機(jī)制、鎖的互斥自等待機(jī)制、鎖的可重入加鎖與釋放鎖的機(jī)制
    2023-02-02
  • 如何通過Java添加水印到Word文檔

    如何通過Java添加水印到Word文檔

    這篇文章主要介紹了如何通過Java添加水印到Word文檔,水印是一種常用于各種文檔的聲明、防偽手段,一般可設(shè)置文字水印或者加載圖片作為水印。以下內(nèi)容將分享通過Java編程給Word文檔添加水印效果的方法,需要的朋友可以參考下
    2019-07-07
  • Java ThreadLocal的使用詳解

    Java ThreadLocal的使用詳解

    ThreadLocal是線程私有的局部變量存儲容器,可以理解成每個線程都有自己專屬的存儲容器,用來存儲線程私有變量。ThreadLocal 在日常開發(fā)框架中應(yīng)用廣泛,但用不好也會出現(xiàn)各種問題,本文就此講解一下。
    2021-05-05
  • Java并發(fā)工具類LongAdder原理實(shí)例解析

    Java并發(fā)工具類LongAdder原理實(shí)例解析

    這篇文章主要介紹了Java并發(fā)工具類LongAdder原理實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • 淺談Java反射與代理

    淺談Java反射與代理

    下面小編就為大家?guī)硪黄獪\談Java反射與代理。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • Springmvc文件上傳實(shí)現(xiàn)流程解析

    Springmvc文件上傳實(shí)現(xiàn)流程解析

    這篇文章主要介紹了Springmvc文件上傳實(shí)現(xiàn)流程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09

最新評論