最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用feign發(fā)送http請求解析報錯的問題

 更新時間:2022年03月16日 08:54:45   作者:yangchuanan  
這篇文章主要介紹了使用feign發(fā)送http請求解析報錯的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

錯誤如下

發(fā)送請求開始

-----
[ChannelFeign#formRecog] ---> END HTTP (304117-byte body)

發(fā)送請求結束

返回開始

[ChannelFeign#formRecog] <--- HTTP/1.1 200 OK (4948ms)
[ChannelFeign#formRecog] content-length: 5207
[ChannelFeign#formRecog] content-type: text/json;charset=UTF-8
[ChannelFeign#formRecog] date: Mon, 08 Oct 2018 10:47:03 GMT
[ChannelFeign#formRecog] x-vcap-request-id: c323f65a-12e6-4604-7393-a4bf0ca403d5
[ChannelFeign#formRecog]?
[ChannelFeign#formRecog] {json格式的數(shù)據(jù)}
[ChannelFeign#formRecog] <--- END HTTP (5207-byte body)

返回結束

ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is feign.codec.DecodeException: Could not extract response: no suitable HttpMessageConverter found for response type [channel.domain.ChannelResponse<TableData>] and content type [text/json;charset=UTF-8]] with root cause
org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [channel.domain.ChannelResponse<TableData>] and content type [text/json;charset=UTF-8]
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:110) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE]
    at org.springframework.cloud.netflix.feign.support.SpringDecoder.decode(SpringDecoder.java:59) ~[spring-cloud-netflix-core-1.3.6.RELEASE.jar:1.3.6.RELEASE]
    at org.springframework.cloud.netflix.feign.support.ResponseEntityDecoder.decode(ResponseEntityDecoder.java:47) ~[spring-cloud-netflix-core-1.3.6.RELEASE.jar:1.3.6.RELEASE]
    at feign.SynchronousMethodHandler.decode(SynchronousMethodHandler.java:165) ~[feign-core-9.5.0.jar:?]
    at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:133) ~[feign-core-9.5.0.jar:?]
    at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:76) ~[feign-core-9.5.0.jar:?]
    at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:103) ~[feign-core-9.5.0.jar:?]

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [channel.domain.ChannelResponse<TableData>] and content type [text/json;charset=UTF-8]

可以看到返回的類型為[ChannelFeign#formRecog] content-type: text/json;charset=UTF-8

錯誤原因

接口返回為JSON格式數(shù)據(jù)但卻將數(shù)據(jù)表示為了[text/json]導致Feign沒有采用JSON解析器來解析,從而無法將響應數(shù)據(jù)轉化為對應的POJO對象;

源碼分析

feign客戶端發(fā)送請求入口函數(shù)invoke()

? ? @Override
? ? public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
? ? ? if ("equals".equals(method.getName())) {
? ? ? ? try {
? ? ? ? ? Object
? ? ? ? ? ? ? otherHandler =
? ? ? ? ? ? ? args.length > 0 && args[0] != null ? Proxy.getInvocationHandler(args[0]) : null;
? ? ? ? ? return equals(otherHandler);
? ? ? ? } catch (IllegalArgumentException e) {
? ? ? ? ? return false;
? ? ? ? }
? ? ? } else if ("hashCode".equals(method.getName())) {
? ? ? ? return hashCode();
? ? ? } else if ("toString".equals(method.getName())) {
? ? ? ? return toString();
? ? ? }
? ? ? // 分發(fā)請求
? ? ? return dispatch.get(method).invoke(args);
? ? }

decode()返回請求的解碼函數(shù)

? Object decode(Response response) throws Throwable {
? ? try {
? ? ? return decoder.decode(response, metadata.returnType());
? ? } catch (FeignException e) {
? ? ? throw e;
? ? } catch (RuntimeException e) {
? ? ? throw new DecodeException(e.getMessage(), e);
? ? }
? }

進入decode.decode(),提取數(shù)據(jù)

@Override
?? ?@SuppressWarnings({"unchecked", "rawtypes", "resource"})
?? ?public T extractData(ClientHttpResponse response) throws IOException {
?? ??? ?MessageBodyClientHttpResponseWrapper responseWrapper = new MessageBodyClientHttpResponseWrapper(response);
?? ??? ?if (!responseWrapper.hasMessageBody() || responseWrapper.hasEmptyMessageBody()) {
?? ??? ??? ?return null;
?? ??? ?}
?? ??? ?MediaType contentType = getContentType(responseWrapper);
?
?? ??? ?for (HttpMessageConverter<?> messageConverter : this.messageConverters) {
?? ??? ??? ?if (messageConverter instanceof GenericHttpMessageConverter) {
?? ??? ??? ??? ?GenericHttpMessageConverter<?> genericMessageConverter =
?? ??? ??? ??? ??? ??? ?(GenericHttpMessageConverter<?>) messageConverter;
?? ??? ??? ??? ?if (genericMessageConverter.canRead(this.responseType, null, contentType)) {
?? ??? ??? ??? ??? ?if (logger.isDebugEnabled()) {
?? ??? ??? ??? ??? ??? ?logger.debug("Reading [" + this.responseType + "] as \"" +
?? ??? ??? ??? ??? ??? ??? ??? ?contentType + "\" using [" + messageConverter + "]");
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?return (T) genericMessageConverter.read(this.responseType, null, responseWrapper);
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?if (this.responseClass != null) {
?? ??? ??? ??? ?if (messageConverter.canRead(this.responseClass, contentType)) {
?? ??? ??? ??? ??? ?if (logger.isDebugEnabled()) {
?? ??? ??? ??? ??? ??? ?logger.debug("Reading [" + this.responseClass.getName() + "] as \"" +
?? ??? ??? ??? ??? ??? ??? ??? ?contentType + "\" using [" + messageConverter + "]");
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?return (T) messageConverter.read((Class) this.responseClass, responseWrapper);
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}
?
?? ??? ?throw new RestClientException("Could not extract response: no suitable HttpMessageConverter found " +
?? ??? ??? ??? ?"for response type [" + this.responseType + "] and content type [" + contentType + "]");
?? ?}

進入genericMessageConverter.canRead(this.responseType, null, contentType) 

?? ?protected boolean canRead(MediaType mediaType) {
?? ??? ?if (mediaType == null) {
?? ??? ??? ?return true;
?? ??? ?}
?? ??? ?for (MediaType supportedMediaType : getSupportedMediaTypes()) {
?? ??? ??? ?if (supportedMediaType.includes(mediaType)) {
?? ??? ??? ??? ?return true;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?return false;
?? ?}

通過斷點發(fā)現(xiàn)mediaType為接口返回的content-type:text/json類型。而supportedMediaType為application/json,所以返回false,找不到合適的轉換器。 

解決方案一

替代Feign的解碼器,使json解析器同時解析[text/plain]的數(shù)據(jù)

// 創(chuàng)建一個新的轉換器 解析微信的 [text/plain]?
public class WxMessageConverter extends MappingJackson2HttpMessageConverter {
? ? public WxMessageConverter(){
? ? ? ? List<MediaType> mediaTypes = new ArrayList<>();
? ? ? ? mediaTypes.add(MediaType.TEXT_PLAIN);
? ? ? ? setSupportedMediaTypes(mediaTypes);
? ? }
}

注入新的Decoder Feign將自動 替換

// 解決微信返回參數(shù)為[text/plain] 無法轉化為json
@Bean
public Decoder feignDecoder(){
? ? WxMessageConverter wxConverter = new WxMessageConverter();
? ? ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(wxConverter);
? ? return new SpringDecoder(objectFactory);
}

解決方案二

對返回的json字符串使用fastjosn轉換

? ? ? ? String result = channelFeign.formRecogTest(channelRequest);
? ? ? ? ChannelResponse<TableData> hello = JSONObject.parseObject(result,
? ? ? ? ? ? ? ? new TypeReference<ChannelResponse<TableData>>() {
? ? ? ? ? ? ? ? });

錯誤2

發(fā)送請求時對象轉換json會自動將屬性的首字母小寫

解決方法:

//@Data
public class ChannelRequest {
? ? //@JSONField(name="Header")
? ? @JsonProperty
? ? private ChannelReqHead Header;
? ? //@JSONField(name="Body")
? ? @JsonProperty
? ? private ChannelReqBody Body;
? ??
? ? // 如果get方法上不加JsonIgnore,jason化時小寫header也會出現(xiàn)
? ? @JsonIgnore
? ? public ChannelReqHead getHeader() {
? ? ? ? return Header;
? ? }
? ? @JsonIgnore
? ? public void setHeader(ChannelReqHead header) {
? ? ? ? Header = header;
? ? }
? ? @JsonIgnore
? ? public ChannelReqBody getBody() {
? ? ? ? return Body;
? ? }
? ? @JsonIgnore
? ? public void setBody(ChannelReqBody body) {
? ? ? ? Body = body;
? ? }? ??
}

使用jsonField不起作用,不使用jsonIgnore會生成大寫和小寫

如:{“Header”:xxx,"header":xxx}

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

相關文章

  • Java實現(xiàn)學生信息管理系統(tǒng)IO版本

    Java實現(xiàn)學生信息管理系統(tǒng)IO版本

    這篇文章主要為大家詳細介紹了Java實現(xiàn)學生信息管理系統(tǒng)IO版本,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • 深入解析Java的Spring框架中bean的依賴注入

    深入解析Java的Spring框架中bean的依賴注入

    這篇文章主要介紹了Java的Spring框架中bean的依賴注入,講解了以構造函數(shù)為基礎的依賴注入和基于setter方法的依賴注入的方式,需要的朋友可以參考下
    2015-12-12
  • java解析json數(shù)組方式

    java解析json數(shù)組方式

    這篇文章主要介紹了java解析json數(shù)組方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 使用springboot配置和占位符獲取配置文件中的值

    使用springboot配置和占位符獲取配置文件中的值

    這篇文章主要介紹了使用springboot配置和占位符獲取配置文件中的值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Spring?Validation接口入?yún)⑿r炇纠a

    Spring?Validation接口入?yún)⑿r炇纠a

    Spring?Validation是一種用于實現(xiàn)數(shù)據(jù)校驗的框架,它提供了一系列的校驗器,針對不同的數(shù)據(jù)類型可以使用不同的校驗器進行校驗,下面這篇文章主要給大家介紹了關于Spring?Validation接口入?yún)⑿r灥南嚓P資料,需要的朋友可以參考下
    2023-06-06
  • 解決因jdk版本引起的TypeNotPresentExceptionProxy異常

    解決因jdk版本引起的TypeNotPresentExceptionProxy異常

    這篇文章介紹了解決因jdk版本引起的TypeNotPresentExceptionProxy異常的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12
  • Spring Boot 整合 Druid過程解析

    Spring Boot 整合 Druid過程解析

    這篇文章主要介紹了Spring Boot 整合 Druid過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • 使用java判斷輸入年份是否為閏年完整代碼

    使用java判斷輸入年份是否為閏年完整代碼

    閏年的引入確保了我們的日歷與地球運行軌道的對齊,使得時間的計算更加準確,在編程中判斷給定年份是否為閏年是一項常見的任務,這篇文章主要給大家介紹了關于使用java判斷輸入年份是否為閏年的相關資料,需要的朋友可以參考下
    2023-10-10
  • 詳解如何在Java中加密和解密zip文件

    詳解如何在Java中加密和解密zip文件

    在本文中,我們來學習如何用Zip4j庫創(chuàng)建受密碼保護的壓縮文件并將其解壓,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2022-09-09
  • Collection中的size()和isEmpty()區(qū)別說明

    Collection中的size()和isEmpty()區(qū)別說明

    這篇文章主要介紹了Collection中的size()和isEmpty()區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評論

时尚| 上高县| 安顺市| 南昌县| 潼南县| 灵寿县| 和静县| 昌都县| 东光县| 三穗县| 高邑县| 左贡县| 井冈山市| 东乡族自治县| 郧西县| 泗水县| 伊宁市| 保靖县| 宁化县| 承德市| 岑溪市| 峨山| 礼泉县| 蓬安县| 镇江市| 油尖旺区| 平南县| 外汇| 静安区| 元谋县| 吉林省| 仪征市| 漳浦县| 剑河县| 聂拉木县| 尤溪县| 东平县| 京山县| 彭山县| 紫金县| 岳阳市|