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

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

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

版本: Spring Cloud 2020.0.3

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

方法1: ErrorWebExceptionHandler (僅供示意)

自定義一個(gè) 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)一個(gè)

@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)一個(gè) 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è)置, 否則會(huì)報(bào)錯(cuò), 因?yàn)?DefaultErrorWebExceptionHandler 的 renderErrorResponse 方法會(huì)獲取此屬性, 重新實(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()) , 否則會(huì)報(bào)錯(cuò), 因?yàn)?DefaultErrorWebExceptionHandler 的 renderErrorResponse 方法會(huì)獲取此屬性. 除非你自己像方法一一樣重新實(shí)現(xiàn) DefaultErrorWebExceptionHandler.

然后在網(wǎng)關(guān)中訪問一個(gè)不存在的服務(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java踩坑記錄之Arrays.AsList

    Java踩坑記錄之Arrays.AsList

    這篇文章主要給大家介紹了關(guān)于Java踩坑記錄之Arrays.AsList的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 這一次搞懂Spring的Bean實(shí)例化原理操作

    這一次搞懂Spring的Bean實(shí)例化原理操作

    這篇文章主要介紹了這一次搞懂Spring的Bean實(shí)例化原理操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Spring事務(wù)管理只對(duì)出現(xiàn)運(yùn)行期異常進(jìn)行回滾

    Spring事務(wù)管理只對(duì)出現(xiàn)運(yùn)行期異常進(jìn)行回滾

    Spring的事務(wù)管理默認(rèn)只對(duì)出現(xiàn)運(yùn)行期異常(java.lang.RuntimeException及其子類)進(jìn)行回滾,需要了解更多Spring事務(wù)方面的知識(shí),可詳看本文
    2012-11-11
  • servlet實(shí)現(xiàn)文件上傳、預(yù)覽、下載、刪除功能

    servlet實(shí)現(xiàn)文件上傳、預(yù)覽、下載、刪除功能

    這篇文章主要為大家詳細(xì)介紹了servlet實(shí)現(xiàn)文件上傳、預(yù)覽、下載、刪除功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • RabbitMQ?Stream插件使用案例代碼

    RabbitMQ?Stream插件使用案例代碼

    這篇文章主要介紹了RabbitMQ?Stream插件使用案例代碼,2.4版為RabbitMQ流插件引入了對(duì)RabbitMQStream插件Java客戶端的初始支持,需要的朋友可以參考下
    2024-04-04
  • SpringBoot集成MinIO的示例代碼

    SpringBoot集成MinIO的示例代碼

    對(duì)象存儲(chǔ)服務(wù)OSS是一種海量、安全、低成本、高可靠的云存儲(chǔ)服務(wù),適合存放任意類型的文件,這篇文章主要介紹了SpringBoot集成MinIO的示例代碼,需要的朋友可以參考下
    2023-06-06
  • Java OSS批量下載并壓縮為ZIP代碼實(shí)例

    Java OSS批量下載并壓縮為ZIP代碼實(shí)例

    這篇文章主要介紹了Java OSS批量下載并壓縮為ZIP代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 關(guān)于Java的HashMap多線程并發(fā)問題分析

    關(guān)于Java的HashMap多線程并發(fā)問題分析

    HashMap是采用鏈表解決Hash沖突,因?yàn)槭擎湵斫Y(jié)構(gòu),那么就很容易形成閉合的鏈路,這樣在循環(huán)的時(shí)候只要有線程對(duì)這個(gè)HashMap進(jìn)行g(shù)et操作就會(huì)產(chǎn)生死循環(huán),本文針對(duì)這個(gè)問題進(jìn)行分析,需要的朋友可以參考下
    2023-05-05
  • spring cloud gateway 如何修改請(qǐng)求路徑Path

    spring cloud gateway 如何修改請(qǐng)求路徑Path

    這篇文章主要介紹了spring cloud gateway 修改請(qǐng)求路徑Path的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • JAVA發(fā)送http get/post請(qǐng)求,調(diào)用http接口、方法詳解

    JAVA發(fā)送http get/post請(qǐng)求,調(diào)用http接口、方法詳解

    這篇文章主要介紹了Java發(fā)送http get/post請(qǐng)求調(diào)用接口/方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評(píng)論

佛学| 陵川县| 固阳县| 运城市| 石渠县| 嵊州市| 怀化市| 阿拉善左旗| 淮北市| 且末县| 社旗县| 宁武县| 杨浦区| 临沭县| 高台县| 旬阳县| 土默特右旗| 武川县| 三江| 如东县| 永和县| 张家口市| 伊金霍洛旗| 虞城县| 五河县| 平顺县| 怀安县| 内江市| 聂拉木县| 顺平县| 两当县| 建平县| 江孜县| 海盐县| 常德市| 洱源县| 阳城县| 保山市| 夹江县| 湟源县| 哈尔滨市|