日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dubbo自定义异常传递信息丢失问题解决

發(fā)布時間:2025/6/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dubbo自定义异常传递信息丢失问题解决 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

訪問我的博客

目前計劃對已有的單體項目進(jìn)行組織架構(gòu)拆分,調(diào)研了分布式系統(tǒng)中常用中間件 Dubbo 和 Spring Cloud,選擇了 Dubbo,可以對當(dāng)前現(xiàn)有項目進(jìn)行平滑升級改造。但是一開始就遇到了麻煩,自定義異常在傳遞的過程中變成了 RuntimeException,統(tǒng)一異常處理 GlobalExceptionHandler 無法獲取異常信息。

問題重現(xiàn)

項目進(jìn)行統(tǒng)一異常處理,抽取了一個通用異常 ServiceException,此異常是非受檢異常,即繼承于 RuntimeException。調(diào)研時發(fā)現(xiàn)如果服務(wù)提供方即 provider 拋出了 ServiceException 異常,consumer 服務(wù)消費方就會收到一個 RuntimeException 異常,而 ServiceException 異常的內(nèi)容被包含在了 RuntimeException 的異常堆棧中

[Request processing failed; nested exception is java.lang.RuntimeException: io.github.mosiki.common.exception.ServiceException: missing_required_parameters io.github.mosiki.common.exception.ServiceException: missing_required_parametersat io.github.mosiki.provider.HelloService.sayHello(HelloService.java:20)at com.alibaba.dubbo.common.bytecode.Wrapper1.invokeMethod(Wrapper1.java)

而我的統(tǒng)一異常處理是這樣的,只處理 ServiceException 以及 Exception,因此就無法獲取到原始異常的信息了。

@Slf4j @RestControllerAdvice public class GlobalExceptionHandler {@ExceptionHandler(ServiceException.class)public Result handlerServiceException(ServiceException ex) {return Result.failure(ex.getCode(), ex.getMessage());}@ExceptionHandler({Exception.class})public Result handlerException(Exception ex) {log.error("發(fā)生未知異常:{}", ex);return Result.failure(HttpStatus.INTERNAL_SERVER_ERROR.value(), "服務(wù)器打了個小盹兒~請稍候再試");} }

訪問接口將返回如下,異常中原有信息丟失。

上網(wǎng)搜索發(fā)現(xiàn),這是因為 dubbo 的異常處理類 com.alibaba.dubbo.rpc.filter.ExceptionFilter 進(jìn)行處理后的結(jié)果,Debug 之后確實如此,dubbo 在此進(jìn)行了轉(zhuǎn)換。

問題解決之道

現(xiàn)在我想要 provider 把自定義的異常原封不動的拋給 consumer 進(jìn)行處理,于是有了如下思路:

  • 禁用 provider 的 ExceptionFilter
  • 讓 GlobalExceptionHandler 處理 consumer 的異常
  • 按照此思路做就很簡單了,網(wǎng)上大多文章的辦法都比較麻煩,有用 AOP 處理的,甚至還有讓自己修改編譯源碼上傳私服的-_-||,本文給出比較簡便的方法,提供參考。

    禁用provider的ExceptionFilter

    修改 provider 的配置,我這里使用 yml 配置文件,其他類型如 xml/properties 也同理,設(shè)置 provider 的 filter 為 -exception,這樣異常就不會被處理而是直接拋出了。

    dubbo:application:name: providerprotocol:name: dubboport: 20100registry:address: 127.0.0.1:2181protocol: zookeeperprovider:filter: -exception

    GlobalExceptionHandler捕獲ServiceException

    只是禁用了 provider 的 ExceptionHandler 還不能完全達(dá)到我們的目的,訪問接口,provider 拋出異常 consumer 正確接收為 ServiceException。

    [Request processing failed; nested exception is io.github.mosiki.common.exception.ServiceException: missing_required_parameters] with root causeio.github.mosiki.common.exception.ServiceException: missing_required_parametersat io.github.mosiki.provider.HelloService.sayHello(HelloService.java:20) ~[na:na]at com.alibaba.dubbo.common.bytecode.Wrapper1.invokeMethod(Wrapper1.java) ~[na:na]

    我們處理一下 GlobalExceptionHandler。

    SpringBoot 主要這個啟動類的位置和全局異常處理器的位置,一定要保證異常處理器在啟動類的同級包或者在啟動類的子包當(dāng)中,否則異常處理器將不生效!

    效果展示

    以上兩步完成后,重啟服務(wù),訪問接口測試。

    拿到了 provider 拋出的原始自定義異常,如此問題就解決了。

    代碼下載

    • https://github.com/Mosiki/dubbo-exception-example-parent

    參考

    • https://blog.csdn.net/yangzaizi/article/details/80638306

    轉(zhuǎn)載于:https://www.cnblogs.com/vcmq/p/10162054.html

    總結(jié)

    以上是生活随笔為你收集整理的dubbo自定义异常传递信息丢失问题解决的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。