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

SpringCloud Feign Jackson自定義配置方式

 更新時(shí)間:2022年03月16日 16:09:48   作者:zhaoyang10  
這篇文章主要介紹了SpringCloud Feign Jackson自定義配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Feign Jackson自定義配置

Spring Cloud Feign 默認(rèn)支持Spring MVC的注解 使用相同的HttpMessageConverters類轉(zhuǎn)換

官方文檔說(shuō)明:

Spring Cloud adds support for Spring MVC annotations and for using the same HttpMessageConverters used by default in Spring Web.

但是我們一般在返回給前端JSON格式的時(shí)候 都會(huì)把相應(yīng)的 NULL值轉(zhuǎn)為相應(yīng)的"",這使得Spring Cloud Feign也使用相同的Jackson配置,例如我們項(xiàng)目的配置

?? ?@Bean
?? ?public ObjectMapper jacksonObjectMapper() {
?? ??? ?ObjectMapper objectMapper = new ObjectMapper();
?? ??? ?// objectMapper.setSerializationInclusion(Include.NON_NULL);
?? ??? ?objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
?? ??? ??? ?@Override
?? ??? ??? ?public void serialize(Object value, JsonGenerator jg, SerializerProvider sp)
?? ??? ??? ??? ?throws IOException, JsonProcessingException {
?? ??? ??? ??? ?jg.writeString("");
?? ??? ??? ??? ?sp.getDefaultNullKeySerializer();
?? ??? ??? ?}
?? ??? ?});
?? ??? ?objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
?? ??? ?return objectMapper;
?? ?}

出現(xiàn)的問(wèn)題

在服務(wù)通過(guò)Feign進(jìn)行請(qǐng)求的時(shí)候,傳NULL值引用類型值時(shí),會(huì)出現(xiàn)類型轉(zhuǎn)換異常,由于HttpMessageConverters直接把NULL轉(zhuǎn)為了""。

解決思路

自定義配置 Spring Cloud Feign Encoder與Decoder

官方文檔說(shuō)明:

Spring Cloud Netflix provides the following beans by default for feign (BeanType beanName: ClassName):Decoder feignDecoder: ResponseEntityDecoder (which wraps a SpringDecoder)Encoder feignEncoder: SpringEncoderLogger feignLogger: Slf4jLoggerContract feignContract: SpringMvcContractFeign.Builder feignBuilder: HystrixFeign.BuilderClient feignClient: if Ribbon is enabled it is a LoadBalancerFeignClient, otherwise the default feign client is used.

解決方法

統(tǒng)一配置Feign 的Encoder和Decoder的Jackson轉(zhuǎn)換方式

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.ResponseEntityDecoder;
import org.springframework.cloud.openfeign.support.SpringDecoder;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import feign.codec.Decoder;
import feign.codec.Encoder;
@Configuration
public class CustomFeignConfig {
? ? @Bean
? ? public Decoder feignDecoder() {
? ? ? ? HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(customObjectMapper());
? ? ? ? ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(jacksonConverter);
? ? ? ? return new ResponseEntityDecoder(new SpringDecoder(objectFactory));
? ? }
? ? @Bean
? ? public Encoder feignEncoder(){
? ? ? ? HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(customObjectMapper());
? ? ? ? ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(jacksonConverter);
? ? ? ? return new SpringEncoder(objectFactory);
? ? }
? ? public ObjectMapper customObjectMapper(){
? ? ? ? ObjectMapper objectMapper = new ObjectMapper();
? ? ? ? //Customize as much as you want
? ? ? ? objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
? ? ? ? return objectMapper;
? ? }
}

如果配置DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT 不起作用可以試試這種方式

public ObjectMapper customObjectMapper(){
? ? ? ? ObjectMapper objectMapper = new ObjectMapper();
? ? ? ? //Customize as much as you want
?? ??? ?objectMapper.registerModule(new StringSanitizerModule());
? ? ? ? return objectMapper;
}
public class StringSanitizerModule extends SimpleModule {
? ? public StringSanitizerModule() {
? ? ? ? addDeserializer(String.class, new StdScalarDeserializer<String>(String.class) {
? ? ? ? ? ? @Override
? ? ? ? ? ? public String deserialize(JsonParser jsonParser, DeserializationContext ctx) throws IOException {
? ? ? ? ? ? ? ?return StringUtils.trimToNull(jsonParser.getValueAsString());
? ? ? ? ? ? }
? ? ? ? });
? ? }
}

Feign自定義配置應(yīng)用

環(huán)境

nacos: 1.3.1

啟動(dòng)nacos

cd /usr/local/nacos/bin

sh startup.sh -m standalone

自定義Feign的配置

1)添加依賴

加入nacos-discovery發(fā)現(xiàn)服務(wù)的依賴、web、actuator用于監(jiān)控檢查,添加openfeign依賴才能使用Feign功能

2)修改配置文件

配置nacos注冊(cè)中心地址,因?yàn)椴惶峁┓?wù),所以不需要再注冊(cè)中心注冊(cè)因此register-enabled=false

3)添加Feign支持

配置FeignConfiguration類文件

Spring Cloud Netflix默認(rèn)的SpringMvcController將替換為feign.Contract.Default

用feign.Contract.Default將契約改為Feign原生的默認(rèn)契約,就可以使用feign自帶的注解了

4)自定義Feign接口

Feign接口文件需和啟動(dòng)類再同一包目錄下,使用@FeignClient注解配置所需要調(diào)用服務(wù),此處nacos-provider是需要在注冊(cè)中心提供服務(wù)

因?yàn)樯厦媾渲昧薴eign.Contract.Deafault,所以在接口中可以使用Feign原生的注解@RequestLine

添加HelloController類文件

此處使用接口MyFeignClient調(diào)用hello方法獲取到nacos-provider客戶端提供的服務(wù)

Feign中記錄日志

1)添加配置項(xiàng)

在配置文件中添加記錄日志的包,* 而每個(gè)FeignClient都需要單獨(dú)配置,它只能響應(yīng)debug級(jí)別的日志

2)設(shè)置日志等級(jí)

在FeignConfiguration類文件中配置日志等級(jí)

日志等級(jí):

  • NONE:不記錄(默認(rèn))
  • BASIC:只記錄請(qǐng)求方法、URL、響應(yīng)狀態(tài)碼和執(zhí)行時(shí)間
  • HEADERS:記錄基本信息,請(qǐng)求和響應(yīng)標(biāo)題
  • FULL: 記錄請(qǐng)求和響應(yīng)標(biāo)題、正文和行數(shù)據(jù)

測(cè)試Feign自定義的配置

啟動(dòng)nacos-provider、feign-config客戶端,進(jìn)入nacos查詢nacos-provider服務(wù)是否注冊(cè)

進(jìn)入瀏覽器端鍵入地址http://localhost:2334/hello,就能訪問(wèn)到nacos-provider提供的服務(wù)內(nèi)容

查看日志

控制臺(tái)會(huì)輸出如下信息

[MyFeignClient#hello] <— HTTP/1.1 200 (405ms)
2020-08-13 16:16:23.021 DEBUG 3680 — [nio-2334-exec-1] com.kk.feign.MyFeignClient : [MyFeignClient#hello] content-length: 16
2020-08-13 16:16:23.021 DEBUG 3680 — [nio-2334-exec-1] com.kk.feign.MyFeignClient : [MyFeignClient#hello] content-type: text/plain;charset=UTF-8
2020-08-13 16:16:23.021 DEBUG 3680 — [nio-2334-exec-1] com.kk.feign.MyFeignClient : [MyFeignClient#hello] date: Thu, 13 Aug 2020 08:16:23 GMT
2020-08-13 16:16:23.021 DEBUG 3680 — [nio-2334-exec-1] com.kk.feign.MyFeignClient : [MyFeignClient#hello]
2020-08-13 16:16:23.021 DEBUG 3680 — [nio-2334-exec-1] com.kk.feign.MyFeignClient : [MyFeignClient#hello] Hello Gateway A!
2020-08-13 16:16:23.021 DEBUG 3680 — [nio-2334-exec-1] com.kk.feign.MyFeignClient : [MyFeignClient#hello] <— END HTTP (16-byte body)

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

相關(guān)文章

  • servlet創(chuàng)建web后端程序的示例代碼

    servlet創(chuàng)建web后端程序的示例代碼

    本文主要介紹了servlet創(chuàng)建web后端程序的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Struts2學(xué)習(xí)筆記(8)-Result常用類型

    Struts2學(xué)習(xí)筆記(8)-Result常用類型

    這篇文章主要介紹Struts2中Result四種常用的類型的用法,希望能給大家做一個(gè)參考。
    2016-06-06
  • IDEA導(dǎo)入Springboot項(xiàng)目,注解和pom文件不識(shí)別的解決

    IDEA導(dǎo)入Springboot項(xiàng)目,注解和pom文件不識(shí)別的解決

    這篇文章主要介紹了IDEA導(dǎo)入Springboot項(xiàng)目,注解和pom文件不識(shí)別的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • JAVA代碼塊你了解嗎

    JAVA代碼塊你了解嗎

    這篇文章主要介紹了舉例說(shuō)明Java中的代碼塊,包括靜態(tài)屬性和非靜態(tài)屬性以及構(gòu)造函數(shù)等相關(guān)的執(zhí)行先后,需要的朋友可以參考下
    2021-09-09
  • SpringBoot靜態(tài)資源的訪問(wèn)方法詳細(xì)介紹

    SpringBoot靜態(tài)資源的訪問(wèn)方法詳細(xì)介紹

    最近在做SpringBoot項(xiàng)目的時(shí)候遇到了“白頁(yè)”問(wèn)題,通過(guò)查資料對(duì)SpringBoot訪問(wèn)靜態(tài)資源做了總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-09-09
  • Java常用的數(shù)據(jù)脫敏方法(手機(jī)、郵箱、身份證號(hào))

    Java常用的數(shù)據(jù)脫敏方法(手機(jī)、郵箱、身份證號(hào))

    這篇文章主要給大家介紹了關(guān)于Java常用的數(shù)據(jù)脫敏(手機(jī)、郵箱、身份證號(hào))的相關(guān)資料,信息脫敏對(duì)某些敏感信息通過(guò)脫敏規(guī)則進(jìn)行數(shù)據(jù)的變形,實(shí)現(xiàn)敏感隱私數(shù)據(jù)的可靠保護(hù),需要的朋友可以參考下
    2023-07-07
  • 淺談java switch如果case后面沒有break,會(huì)出現(xiàn)什么情況?

    淺談java switch如果case后面沒有break,會(huì)出現(xiàn)什么情況?

    這篇文章主要介紹了淺談java switch如果case后面沒有break,會(huì)出現(xiàn)什么情況?具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨想小編過(guò)來(lái)看看吧
    2020-09-09
  • java線程池對(duì)象ThreadPoolExecutor的深入講解

    java線程池對(duì)象ThreadPoolExecutor的深入講解

    在我們的開發(fā)中“池”的概念并不罕見,有數(shù)據(jù)庫(kù)連接池、線程池、對(duì)象池、常量池等等。下面這篇文章主要給大家介紹了關(guān)于java線程池對(duì)象ThreadPoolExecutor的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧
    2018-09-09
  • Java gif圖片轉(zhuǎn)換為jpg格式

    Java gif圖片轉(zhuǎn)換為jpg格式

    這篇文章主要介紹了Java gif圖片轉(zhuǎn)換為jpg格式的實(shí)例代碼,文中給大家提到了用java將png圖片轉(zhuǎn)換成jpg格式的圖片,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Spring Boot如何使用AOP實(shí)例解析

    Spring Boot如何使用AOP實(shí)例解析

    這篇文章主要介紹了Spring Boot如何使用AOP實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論