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

Feign接口方法返回值設(shè)置方式

 更新時間:2021年07月08日 14:20:48   作者:CoderYin  
這篇文章主要介紹了Feign接口方法返回值設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

一、介紹

隨著微服務(wù)的廣泛應(yīng)用,越來越多的企業(yè)都會使用微服務(wù)進(jìn)行項目開發(fā),在各個服務(wù)之間需要通過feign來進(jìn)行通信,所以在feign調(diào)用接口中方法會接受其他服務(wù)接口不同類型返回值。

二、返回值設(shè)置

1、依據(jù)被調(diào)用服務(wù)接口設(shè)置相同返回類型

介紹:微服務(wù)A接口getUser 返回List<User>類型,微服務(wù)B通過feign調(diào)用方法也返回相同的結(jié)果類型。

特點:返回類型一一對應(yīng),在調(diào)用時不需要進(jìn)行轉(zhuǎn)化直接拿來就可以用。

缺點:擴展性不好,維護(hù)性不加。

解釋:在目前springboot開發(fā)中,接口一般都會返回json類型數(shù)據(jù)(也就是使用@restController或者使用@ResponseBody注解修飾),就算是對象或者對象集合也是一樣的,或者其他自己封裝的返回對象。如果有許多不同的返回對象,當(dāng)這些返回對象在A服務(wù)做了修改相應(yīng)的在B服務(wù)的feign接口處也要做修改,相當(dāng)麻煩且不符合java面向接口編程思想。

2、全部設(shè)置為String

介紹:微服務(wù)A接口只要被@restController或者使用@ResponseBody注解修飾我統(tǒng)統(tǒng)在微服務(wù)Bfeign接口使用String來進(jìn)行接受。

特點:通過String來接受返回參數(shù),格式一致。

缺點:后面調(diào)用需要轉(zhuǎn)換。

代碼介紹:

// 微服務(wù)A controller 已經(jīng)使用@restController修飾
@PostMapping(value="/getAllQuestionBank",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
	public List<QuestionBankDto> getAllQuestionBank(){
		return baseinfoQuestionMange.getAllQuestionBank();
}
 
// 微服務(wù)B feign接口 使用String進(jìn)行接受
@PostMapping(value="/baseinfo/getAllQuestionBank")
String getAllQuestionBank();
 
// 微服務(wù)B 當(dāng)需要調(diào)用feign信息時需要強轉(zhuǎn)成List<QuestionBankDto>格式 
 
// 調(diào)用微服務(wù)獲取題庫章節(jié)信息,該處強制使用try catch進(jìn)行包裹
String questionBankInfo = baseInfoApi.getAllQuestionBank();
List<QuestionBankDto> mysqlQuestionBank = objectMapper.readValue(questionBankInfo,new TypeReference<ArrayList<QuestionBankDto>>(){});

只要你導(dǎo)入一下springboot依賴,它默認(rèn)就給你導(dǎo)入了Jackson jar包

注意事項:使用該方式時需要將ObjectMapper配置到bean容器中。

3、總結(jié)

項目不同,需求不同,兩種方式?jīng)]有誰對誰錯之分,依據(jù)自己項目需求進(jìn)行選擇。

Feign 使用這幾天遇到的一些問題

事情的起因要從我打算調(diào)用下paas模塊服務(wù)開始

Feign 現(xiàn)在教程很多,然后引入下pom

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

自己定義下接口

@FeignClient(name = "weixinTokenClient", url = "https://qyapi.weixin.qq.com/cgi-bin")
public interface IWeiXinTokenClient {
   /**
    * 獲取應(yīng)用的token
    * @param corpid
    * @param corpsecret
    * @return
    */
   @RequestMapping(value = "/gettoken", method = RequestMethod.GET)
   WeiXinTokenResultModel getToken(@RequestParam String corpid, @RequestParam String corpsecret);
}

寫個test類測試下,完美返回,因為自己寫過類似的項目,可以看下lemur-http,原理大體一致,想了想還是簡單的.但是后面的問題就出來

1. nacos 配置拿不到服務(wù)

原因是:nacos注冊服務(wù)只注冊了lemur-admin和lemur-paas這種服務(wù)級別的服務(wù),獲取服務(wù)地址需要用lemur-admin服務(wù),但是在admin調(diào)用paas接口的時候

@FeignClient(value = "paasUserFacade", contextId = "lemur-paas", path = "/im/user")
public interface IPaasUserFacade extends IBaseController<PaasUserRequestModel> {
}

@FeignClient注解不論是value,name,contextId ,serviceId全都是當(dāng)做了name,所以在獲取nacos地址的地方都是用paasUserFacade去匹配的,根本無法拿到,最終一直跟了N遍代碼,也沒有找打解決辦法,自己還是改了源碼FeignClientFactoryBean,在注冊bean的地方還是使用value ,并且不用contextId 注冊別名,意義不大,還重名,把contextId 當(dāng)做服務(wù)Id,feign是通過target來做地址解析的,所以只要把target的url地址改為lemur-paas/im/user就可以了

<T> T getTarget() {
  FeignContext context = this.applicationContext.getBean(FeignContext.class);
  Feign.Builder builder = feign(context);
  if (!StringUtils.hasText(this.url)) {
   if (StringUtils.hasText(this.contextId) && !this.name.startsWith("http")){
    this.url =  "http://" + this.contextId;
   }else if (StringUtils.hasText(this.contextId)){
    this.url =  this.contextId;
   } else if (!this.name.startsWith("http")) {
    this.url = "http://" + this.name;
   }
   else {
    this.url = this.name;
   }
   this.url += cleanPath();
   return (T) loadBalance(builder, context,
     new HardCodedTarget<>(this.type, this.name, this.url));
  }
  if (StringUtils.hasText(this.url) && !this.url.startsWith("http")) {
   this.url = "http://" + this.url;
  }
  String url = this.url + cleanPath();
  Client client = getOptional(context, Client.class);
  if (client != null) {
   if (client instanceof LoadBalancerFeignClient) {
    // not load balancing because we have a url,
    // but ribbon is on the classpath, so unwrap
    client = ((LoadBalancerFeignClient) client).getDelegate();
   }
   builder.client(client);
  }
  Targeter targeter = get(context, Targeter.class);
  return (T) targeter.target(this, builder, context,
    new HardCodedTarget<>(this.type, this.name, url));
 }

改完源碼之后,算是可以互相調(diào)用了

2.fastjson 不支持abstract class ,關(guān)鍵是不報錯,直接返回null

因為風(fēng)鈴統(tǒng)一返回的都是Response對象,加泛型,結(jié)果怎么調(diào)用返回的都是null,看看被調(diào)用的服務(wù)是有收到請求并返回的,這個只能是客戶端的問題了,一開始以為是泛型解析的問題,跟蹤了整個調(diào)用解析鏈條

ReflectiveFeign.invoke->
SynchronousMethodHandler.invoke->
executeAndDecode->decode(解析對象)->
ResponseEntityDecoder.decode->
SpringDecoder.decode->
HttpMessageConverterExtractor.extractData(返回泛型)->
FastJsonHttpMessageConverter(真正的解析器).read(type,clazz,inputMessage)->
parseObject(is)

然后發(fā)現(xiàn)什么,fastjson無法實例化對象,我去你也報個錯啊,把abstract去掉,就正常返回了

3.spring gateway 不支持web

spring gateway 因為使用webflux寫的,不是web容器所以不能引入web,在引入feign的時候要把web去掉,不然起不來

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-starter-web</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>

同時spring gateway 也不支持讀取配置文件,同理原因,像j2cache的文件配置方式就讀取不到

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

相關(guān)文章

  • java異常處理throws完成異常拋出詳解

    java異常處理throws完成異常拋出詳解

    這篇文章主要介紹了java異常處理中throws完成異常拋出示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家學(xué)有所得多多進(jìn)步
    2021-10-10
  • mybatis如何使用Java8的日期LocalDate和LocalDateTime詳解

    mybatis如何使用Java8的日期LocalDate和LocalDateTime詳解

    這篇文章主要給大家介紹了關(guān)于mybatis如何使用Java8的日期LocalDate和LocalDateTime的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • SpringBoot在idea中的 .idea和 .iml文件的作用

    SpringBoot在idea中的 .idea和 .iml文件的作用

    本文主要介紹了SpringBoot在idea中的 .idea和 .iml文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • Java二叉樹查詢原理深入分析講解

    Java二叉樹查詢原理深入分析講解

    這篇文章主要介紹了Java二叉樹查詢原理,二叉查找樹,又稱二叉排序樹,亦稱二叉搜索樹,是數(shù)據(jù)結(jié)構(gòu)中的一類。在一般情況下,查找效率比鏈表結(jié)構(gòu)要高
    2022-11-11
  • Java使用鎖解決銀行取錢問題實例分析

    Java使用鎖解決銀行取錢問題實例分析

    這篇文章主要介紹了Java使用鎖解決銀行取錢問題,結(jié)合實例形式分析了java線程同步與鎖機制相關(guān)原理及操作注意事項,需要的朋友可以參考下
    2019-08-08
  • Mybatis 如何在配置文件中給實體類起別名

    Mybatis 如何在配置文件中給實體類起別名

    這篇文章主要介紹了Mybatis 如何在配置文件中給實體類起別名的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Springdoc替換swagger的實現(xiàn)步驟分解

    Springdoc替換swagger的實現(xiàn)步驟分解

    最近在spring看到的,spring要對api文檔動手了,有些人說swagger不好用,其實也沒那么不好用,有人說代碼還是有點侵入性,這倒是真的,我剛試了springdoc可以說還是有侵入性但是也可以沒有侵入性,這就看你對文檔有什么要求了
    2023-02-02
  • MyBatisPlus-QueryWrapper多條件查詢及修改方式

    MyBatisPlus-QueryWrapper多條件查詢及修改方式

    這篇文章主要介紹了MyBatisPlus-QueryWrapper多條件查詢及修改方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • dubbo集成zipkin獲取Traceid的實現(xiàn)

    dubbo集成zipkin獲取Traceid的實現(xiàn)

    這篇文章主要介紹了dubbo集成zipkin獲取Traceid的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 詳解spring 配置的兩種方式:JAVA配置和注解配置

    詳解spring 配置的兩種方式:JAVA配置和注解配置

    這篇文章主要介紹了詳解spring 配置的兩種方式:JAVA配置和注解配置,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06

最新評論