亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

利用feign調(diào)用返回object類型轉(zhuǎn)換成實(shí)體

 更新時(shí)間:2022年03月16日 15:43:41   作者:Sue_小石頭  
這篇文章主要介紹了利用feign調(diào)用返回object類型轉(zhuǎn)換成實(shí)體,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

feign調(diào)用返回object轉(zhuǎn)成實(shí)體

<dependency>
? ? <groupId>com.fasterxml.jackson.core</groupId>
? ? <artifactId>jackson-databind</artifactId>
? ? <version>2.9.8</version>
</dependency>
ObjectMapper mapper=new ObjectMapper();
CourseMaster courseMaster = mapper.convertValue(bean,CourseMaster.class);
List<CourseMaster> list=(List<CourseMaster>)courseMasterList;//返回為Object類型
for(Object cs:list){
? ? CourseMaster courseMaster = mapper.convertValue(cs,CourseMaster.class);
}

feign調(diào)用報(bào)類型轉(zhuǎn)換錯(cuò)誤

問題現(xiàn)象

springcloud feign服務(wù)間調(diào)用,運(yùn)行至下圖1代碼A處報(bào)錯(cuò):

java.util.LinkedHashMap cannot be cast to(報(bào)錯(cuò)如下圖2所示)

排查過程

step1:大多數(shù)情況下,第一反應(yīng)是仔細(xì)檢查語(yǔ)法是否有問題,確認(rèn)lambda表達(dá)式本身沒有問題;

step2:在確認(rèn)寫的沒有問題的情況下,將代碼片段拎出來(lái)寫一個(gè)main方法運(yùn)行(如圖1代碼片段B),發(fā)現(xiàn)單獨(dú)拿出來(lái)在main方法中運(yùn)行時(shí)正常!

step3:此時(shí)陷入困惑,于是重新仔細(xì)閱讀報(bào)錯(cuò)信息:LinkedHashMap cannot be cast to xxx.BaseComapny,可以很清楚的確定是類型轉(zhuǎn)換錯(cuò)誤。

再一行一行看代碼(圖1中代碼片段A),發(fā)現(xiàn)只有在代碼片段A上方的:List list = xxxxx這一段中有可能的類型轉(zhuǎn)換,所以暫時(shí)定位至此行代碼。

step4:step3中的推測(cè)不確定的原因在于:此行代碼中responseObject是直接通過服務(wù)調(diào)用獲取到的,請(qǐng)求響應(yīng)參數(shù)中已指定了對(duì)象類型,所以我認(rèn)為這里不存在強(qiáng)制類型轉(zhuǎn)換,也不存在LinkedHashMap。

繼續(xù)沿著上面的推測(cè),如果確實(shí)存在問題,那只可能是通過服務(wù)調(diào)用獲取到的返回參數(shù)與預(yù)期不一致,step5:于是分別對(duì)上面圖1中代碼A和代碼B(也就是main方法)做debug,結(jié)果如下圖所示,發(fā)現(xiàn)確實(shí)服務(wù)調(diào)用后獲取的響應(yīng)參數(shù)與main方法中的不一致??梢钥吹狡蜛服務(wù)調(diào)用得到的響應(yīng)參數(shù)list中確實(shí)是LinkedHashMap!至此發(fā)現(xiàn)問題!

step6:由于確定自己沒有對(duì)服務(wù)調(diào)用前后特殊處理過響應(yīng)參數(shù),所以考慮這是框架行為,至此問題基本找到原因。

問題原因

找出原因后再針對(duì)性的百度答案就比較容易得到,簡(jiǎn)單來(lái)說(shuō)就是使用feign進(jìn)行遠(yuǎn)程服務(wù)調(diào)用的時(shí)候,返回參數(shù)(在我的代碼中,Response中的list部分)會(huì)變成LinkedHashMap。

以下是網(wǎng)上能找到的流傳最多的解釋(因?yàn)閺?fù)制這段話的文章和博客太多了,無(wú)法確認(rèn)誰(shuí)復(fù)制了誰(shuí),也無(wú)法確認(rèn)第一個(gè)寫的作者是誰(shuí),所以無(wú)法標(biāo)注出原作者):

這是因?yàn)镽PC遠(yuǎn)程調(diào)用在底層使用的HTTPClient,所以在傳遞參數(shù)的時(shí)候,必定要有個(gè)順序,當(dāng)你傳遞Map的時(shí)候Map里面的值也要有順序,不然服務(wù)層在接的時(shí)候就出問題了,所以它才會(huì)從Map轉(zhuǎn)為L(zhǎng)inkedHashMap!Spring 有一個(gè)類叫ModelMap,繼承了LinkedHashMap ,所以一個(gè)接口返回的結(jié)果就可以直接用ModelMap來(lái)接,注意ModelMap是沒有泛型的,不管你返回的結(jié)果是什么類型的Map,泛型是多復(fù)雜的Map,都可以直接new一個(gè)ModelMap,用它來(lái)接返回的結(jié)果。

解決辦法

1、最簡(jiǎn)單的解決辦法就是在接收響應(yīng)參數(shù)的地方直接用LinkedHashMap接收,通過kv形式獲取到參數(shù);

2、通過json,objectmapper等方式將LinkedHashMap轉(zhuǎn)換成自己想要的對(duì)象;

3、對(duì)feign調(diào)用得到的響應(yīng)參數(shù)做自定義處理(也許可以?);

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java虛擬機(jī)JVM性能優(yōu)化(一):JVM知識(shí)總結(jié)

    Java虛擬機(jī)JVM性能優(yōu)化(一):JVM知識(shí)總結(jié)

    這篇文章主要介紹了Java虛擬機(jī)JVM性能優(yōu)化(一):JVM知識(shí)總結(jié),本文是系列文章的第一篇,后續(xù)篇章請(qǐng)繼續(xù)關(guān)注腳本之家,需要的朋友可以參考下
    2014-09-09
  • Mybatis傳遞多個(gè)參數(shù)進(jìn)行SQL查詢的用法

    Mybatis傳遞多個(gè)參數(shù)進(jìn)行SQL查詢的用法

    本文給大家介紹Mybatis傳遞多個(gè)參數(shù)進(jìn)行SQL查詢的用法的相關(guān)知識(shí),本文還給大家介紹了mybatis通過Map傳遞多個(gè)參數(shù)和JavaBean傳遞多個(gè)參數(shù),本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧
    2016-06-06
  • MyBatis Plus中代碼生成器使用詳解

    MyBatis Plus中代碼生成器使用詳解

    這篇文章主要介紹了MyBatis Plus中代碼生成器使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java中Date和LocalDate區(qū)別與介紹

    Java中Date和LocalDate區(qū)別與介紹

    本文主要介紹了Java中Date和LocalDate區(qū)別與介紹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 在Spring使用iBatis及配置講解

    在Spring使用iBatis及配置講解

    今天小編就為大家分享一篇關(guān)于在Spring使用iBatis及配置講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Java中的WeakHashMap、LinkedHashMap、TreeMap與Set詳解

    Java中的WeakHashMap、LinkedHashMap、TreeMap與Set詳解

    這篇文章主要介紹了Java中的WeakHashMap、LinkedHashMap、TreeMap與Set詳解,在JVM中,一個(gè)對(duì)象如果不再被使用就會(huì)被當(dāng)做垃圾給回收掉,判斷一個(gè)對(duì)象是否是垃圾,我們的WeakHashMap就是基于弱引用,需要的朋友可以參考下
    2023-09-09
  • springboot+mybatis+redis 二級(jí)緩存問題實(shí)例詳解

    springboot+mybatis+redis 二級(jí)緩存問題實(shí)例詳解

    Mybatis默認(rèn)沒有開啟二級(jí)緩存,需要在全局配置(mybatis-config.xml)中開啟二級(jí)緩存。本文講述的是使用Redis作為緩存,與springboot、mybatis進(jìn)行集成的方法。需要的朋友參考下吧
    2017-12-12
  • SpringBoot整合aws的示例代碼

    SpringBoot整合aws的示例代碼

    本文通過實(shí)例代碼給大家介紹SpringBoot整合aws的全過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-12-12
  • 設(shè)置tomcat啟用gzip壓縮的具體操作方法

    設(shè)置tomcat啟用gzip壓縮的具體操作方法

    如果發(fā)現(xiàn)內(nèi)容沒有被壓縮,可以考慮調(diào)整compressionMinSize大小,如果請(qǐng)求資源小于這個(gè)數(shù)值,則不會(huì)啟用壓縮
    2013-08-08
  • JAVA基于SnakeYAML實(shí)現(xiàn)解析與序列化YAML

    JAVA基于SnakeYAML實(shí)現(xiàn)解析與序列化YAML

    這篇文章主要介紹了JAVA基于SnakeYAML實(shí)現(xiàn)解析與序列化YAML,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評(píng)論