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

SpringCloud OpenFeign自定義結(jié)果解碼器方式

 更新時(shí)間:2023年09月01日 09:57:14   作者:david'fantasy  
這篇文章主要介紹了SpringCloud OpenFeign自定義結(jié)果解碼器方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

SpringCloud OpenFeign自定義結(jié)果解碼器

我們在定義微服務(wù)接口的時(shí)候,通常會(huì)使用一個(gè)Result類進(jìn)行封裝,將提示信息,返回對(duì)象和狀態(tài)碼等內(nèi)容封裝到一起返回給調(diào)用方,

例如

如下的格式:

public class Result<T> {
    /**
     * 響應(yīng)碼,200為成功
     */
    private Integer code;
    /**
     * 失敗時(shí)的具體失敗信息
     */
    private String message;
    /**
     * 失敗信息是否為用戶提示,如果是的話框架不會(huì)主動(dòng)攔截該錯(cuò)誤
     */
    private boolean userPrompt;
    /**
     * 響應(yīng)的具體對(duì)象
     */
    private T data;
}

而調(diào)用方在使用Spring Cloud OpenFeign定義的客戶端調(diào)用遠(yuǎn)程服務(wù)時(shí),默認(rèn)的解碼器只能按照定義的方法返回類型對(duì)接口的返回結(jié)果進(jìn)行強(qiáng)制轉(zhuǎn)換,沒辦法實(shí)現(xiàn)一些自定義的邏輯,比如將統(tǒng)一返回的Result類重新拆開,僅返回對(duì)應(yīng)的業(yè)務(wù)對(duì)象,或者對(duì)特定的響應(yīng)碼進(jìn)行處理等等。

為了實(shí)現(xiàn)上述功能,我們就需要改造默認(rèn)的Decoder。

Spring Cloud OpenFeign允許我們在定義一個(gè)Feign Client的時(shí)候,指定一個(gè)額外的配置類,比如:

@FeignClient(name = "stores", configuration = CustomizedConfiguration.class)
public interface StoreClient {
    //..
}

而這個(gè)配置類就可以作為我們的擴(kuò)展點(diǎn),我們可以在CustomizedConfiguration中定義一個(gè)自己的Decoder來覆蓋默認(rèn)的配置。

Spring Cloud對(duì)Feign的封裝和默認(rèn)配置可以查看官方文檔

自定義的Decoder需要實(shí)現(xiàn)feign.codec.Decoder接口,也可以參考默認(rèn)的Decoder的實(shí)現(xiàn)邏輯(org.springframework.cloud.openfeign.support.ResponseEntityDecoder),下面的實(shí)現(xiàn)可以對(duì)統(tǒng)一返回值Result類的拆分,并對(duì)異常返回進(jìn)行處理:

public class FeignResultDecoder implements Decoder {
    @Override
    public Object decode(Response response, Type type) throws IOException, DecodeException, FeignException {
        if (response.body() == null) {
            throw new DecodeException(response.status(), "沒有返回有效的數(shù)據(jù)", response.request());
        }
        String bodyStr = Util.toString(response.body().asReader(Util.UTF_8));
        //對(duì)結(jié)果進(jìn)行轉(zhuǎn)換
        Result result = (Result) JsonUtil.json2obj(bodyStr, type);
        //如果返回錯(cuò)誤,且為內(nèi)部錯(cuò)誤,則直接拋出異常
        if (result.getCode() != ResultCode.SUCCESS.code) {
            if (!result.isUserPrompt()) {
                throw new DecodeException(response.status(), "接口返回錯(cuò)誤:" + result.getMessage(), response.request());
            }
        }
        return result.data;
    }
}

其中如何將response中的json轉(zhuǎn)換為實(shí)際的返回類型很費(fèi)了一些功夫,因?yàn)榭赡艽嬖趶?fù)雜的嵌套關(guān)系和泛型定義,最后才發(fā)現(xiàn)jackson框架已經(jīng)有默認(rèn)的實(shí)現(xiàn)了…

代碼如下:

public static <T> T json2obj(String jsonStr, Type targetType) {
        try {
            JavaType javaType = TypeFactory.defaultInstance().constructType(targetType);
            return mapper.readValue(jsonStr, javaType);
        } catch (IOException e) {
            throw new IllegalArgumentException("將JSON轉(zhuǎn)換為對(duì)象時(shí)發(fā)生錯(cuò)誤:" + jsonStr, e);
        }
    }

實(shí)現(xiàn)了Decoder之后,只需要將其配置到CustomizedConfiguration中即可,注意如果CustomizedConfiguration添加了@Configuration的注解,則會(huì)成為Feign Client構(gòu)建的默認(rèn)配置,這樣就不需要在每個(gè)@FeignClient注解中都去指定配置類了:

public class CustomizedConfiguration{
    @Bean
    public Decoder feignDecoder() {
        return new FeignResultDecoder();
    }
}

添加了自定義的Decoder之后,如果一個(gè)遠(yuǎn)程接口的定義是這樣的:

@GetMapping("/api/user/detail")
 public Result<User> detailById(@RequestParam("id") Integer id) {
        User user = userService.getById(id);
        return ResultGenerator.genSuccessResult(user);
 }

我們定義Feign Client方法的時(shí)候,方法的返回值可以直接使用Result的泛型類型:

 @RequestMapping(value = "/api/user/detail", method = RequestMethod.GET)
 public User detailById(@RequestParam("id") Integer id)

類似的方式,我們還可以自定義Feign的Encoder,ErrorDecoder等關(guān)鍵配置組件。

總結(jié)

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

相關(guān)文章

  • 解決spring中redistemplate不能用通配符keys查出相應(yīng)Key的問題

    解決spring中redistemplate不能用通配符keys查出相應(yīng)Key的問題

    這篇文章主要介紹了解決spring中redistemplate不能用通配符keys查出相應(yīng)Key的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • SpringBoot配置logback的步驟

    SpringBoot配置logback的步驟

    這篇文章主要介紹了SpringBoot配置logback的步驟,幫助大家更好的理解和使用SpringBoot框架,感興趣的朋友可以了解下
    2020-09-09
  • 在SpringBoot中使用lombok的注意事項(xiàng)

    在SpringBoot中使用lombok的注意事項(xiàng)

    這篇文章主要介紹了在SpringBoot中使用lombok的注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • maven環(huán)境變量配置講解

    maven環(huán)境變量配置講解

    這篇文章主要介紹了maven環(huán)境變量配置講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++/java 繼承類的多態(tài)詳解及實(shí)例代碼

    C++/java 繼承類的多態(tài)詳解及實(shí)例代碼

    這篇文章主要介紹了C++/java 繼承類的多態(tài)詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Maven?Settings.xml的基本語法詳解

    Maven?Settings.xml的基本語法詳解

    這篇文章主要為大家介紹了Maven?Settings.xml的基本語法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Java Stream map, Collectors(toMap, toList, toSet, groupingBy, collectingAndThen)使用案例

    Java Stream map, Collectors(toMap, toLis

    這篇文章主要介紹了Java Stream map, Collectors(toMap, toList, toSet, groupingBy, collectingAndThen)使用案例,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • 關(guān)于Spring Cloud健康檢查的陷阱

    關(guān)于Spring Cloud健康檢查的陷阱

    這篇文章主要介紹了關(guān)于Spring Cloud健康檢查的陷阱,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 使用@Validated注解進(jìn)行校驗(yàn)卻沒有效果的解決

    使用@Validated注解進(jìn)行校驗(yàn)卻沒有效果的解決

    這篇文章主要介紹了使用@Validated注解進(jìn)行校驗(yàn)卻沒有效果的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • SpringBoot整合Druid數(shù)據(jù)庫連接池的方法

    SpringBoot整合Druid數(shù)據(jù)庫連接池的方法

    Druid是Java語言中最好的數(shù)據(jù)庫連接池。Druid能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能。這篇文章主要介紹了SpringBoot整合Druid數(shù)據(jù)庫連接池的方法,需要的朋友可以參考下
    2020-07-07

最新評(píng)論