亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Feign接口方法返回值設置方法

發布時間:2021-07-08 15:39:52 來源:億速云 閱讀:1732 作者:chen 欄目:開發技術

這篇文章主要介紹“Feign接口方法返回值設置方法”,在日常操作中,相信很多人在Feign接口方法返回值設置方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Feign接口方法返回值設置方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、介紹

隨著微服務的廣泛應用,越來越多的企業都會使用微服務進行項目開發,在各個服務之間需要通過feign來進行通信,所以在feign調用接口中方法會接受其他服務接口不同類型返回值。

二、返回值設置

1、依據被調用服務接口設置相同返回類型

介紹:微服務A接口getUser 返回List<User>類型,微服務B通過feign調用方法也返回相同的結果類型。

特點:返回類型一一對應,在調用時不需要進行轉化直接拿來就可以用。

缺點:擴展性不好,維護性不加。

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

2、全部設置為String

介紹:微服務A接口只要被@restController或者使用@ResponseBody注解修飾我統統在微服務Bfeign接口使用String來進行接受。

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

缺點:后面調用需要轉換。

代碼介紹:

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

Feign接口方法返回值設置方法

只要你導入一下springboot依賴,它默認就給你導入了Jackson jar包

Feign接口方法返回值設置方法

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

Feign接口方法返回值設置方法

3、總結

項目不同,需求不同,兩種方式沒有誰對誰錯之分,依據自己項目需求進行選擇。

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

事情的起因要從我打算調用下paas模塊服務開始

Feign 現在教程很多,然后引入下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 {
   /**
    * 獲取應用的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 配置拿不到服務

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

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

@FeignClient注解不論是value,name,contextId ,serviceId全都是當做了name,所以在獲取nacos地址的地方都是用paasUserFacade去匹配的,根本無法拿到,最終一直跟了N遍代碼,也沒有找打解決辦法,自己還是改了源碼FeignClientFactoryBean,在注冊bean的地方還是使用value ,并且不用contextId 注冊別名,意義不大,還重名,把contextId 當做服務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));
 }

改完源碼之后,算是可以互相調用了

2.fastjson 不支持abstract class ,關鍵是不報錯,直接返回null

因為風鈴統一返回的都是Response對象,加泛型,結果怎么調用返回的都是null,看看被調用的服務是有收到請求并返回的,這個只能是客戶端的問題了,一開始以為是泛型解析的問題,跟蹤了整個調用解析鏈條

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

然后發現什么,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的文件配置方式就讀取不到

到此,關于“Feign接口方法返回值設置方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宕昌县| 东乡县| 偏关县| 海原县| 康保县| 葵青区| 越西县| 孝昌县| 淅川县| 沽源县| 遂宁市| 汝阳县| 岫岩| 吴忠市| 鹤庆县| 石台县| 庆阳市| 康平县| 柳江县| 通江县| 同江市| 濮阳市| 古蔺县| 中宁县| 宜兰市| 四平市| 隆化县| 鄂伦春自治旗| 永福县| 阿克苏市| 张北县| 务川| 宕昌县| 新龙县| 克拉玛依市| 绥棱县| 呼伦贝尔市| 五河县| 巴彦县| 策勒县| 淮阳县|