openfeign返回消息报错.UnknownContentTypeException

1. springcloud项目使用openfeign报错
复制代码
org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [com.yl.base.Result<java.util.List<com.yl.entity.LabelConfig>>]  and content type [application/json]
	at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:126)
	at org.springframework.cloud.openfeign.support.SpringDecoder.decode(SpringDecoder.java:57)
	at org.springframework.cloud.openfeign.support.ResponseEntityDecoder.decode(ResponseEntityDecoder.java:61)
	at feign.AsyncResponseHandler.decode(AsyncResponseHandler.java:115)
	at feign.AsyncResponseHandler.handleResponse(AsyncResponseHandler.java:87)
	at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:138)

pom.xml 依赖

xml 复制代码
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
	<version>3.0.7</version>
</dependency>
2. 分析
复制代码
项目启动,调用接口,有时报错,重启后调用相同接口,有时好,有时报错,分析发现是feign接口返回值反序列化时无法处理,自定义处理后正常了
3. 自定义返回值解析器
java 复制代码
import com.alibaba.fastjson.JSON;
import feign.FeignException;
import feign.Response;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.SpringDecoder;

import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
/**
 * Feign接口响应数据处理
 */
public class FeignResponseInterceptor extends SpringDecoder {
 public FeignResponseInterceptor(ObjectFactory<HttpMessageConverters> messageConverters) {
        super(messageConverters);
    }

    @Override
    public Object decode(final Response response, Type type) throws IOException, FeignException {
        Response.Body body = response.body();
        String bodyString = IOUtils.toString(body.asReader(StandardCharsets.UTF_8));
        //响应日志

        // 此处有bug,有时没问题,有时报错
        // org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [com.yl.base.Result<java.util.List<com.yl.entity.LabelConfig>>]  and content type [application/json]
//        Object o = super.decode(response.toBuilder().body(bodyString, StandardCharsets.UTF_8).build(), type);
        //改为fastjson反序列化
        Object o = JSON.parseObject(bodyString).toJavaObject(type);
        return o;
    }
}

配置FeignResponseInterceptor

java 复制代码
import feign.codec.Decoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

import java.util.ArrayList;
import java.util.List;
@Configuration
public class FeignConfig {

    @Primary
    @Bean
    public Decoder decoder() {
        MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();

        List<MediaType> supportedMediaTypes = new ArrayList<>();
        supportedMediaTypes.add(MediaType.APPLICATION_JSON);
        jackson2HttpMessageConverter.setSupportedMediaTypes(supportedMediaTypes);

        ObjectFactory objectFactory = () -> new HttpMessageConverters(jackson2HttpMessageConverter);
        return new FeignResponseInterceptor(objectFactory);
    }
}
相关推荐
短剑重铸之日3 小时前
《SpringCloud实用版》生产部署:Docker + Kubernetes + GraalVM 原生镜像 完整方案
后端·spring cloud·docker·kubernetes·graalvm
短剑重铸之日5 小时前
《SpringCloud实用版》 Seata 分布式事务实战:AT / TCC / Saga /XA
后端·spring·spring cloud·seata·分布式事务
编程彩机8 小时前
互联网大厂Java面试:从Spring Cloud到分布式事务的技术场景解析
java·spring cloud·微服务·消息队列·分布式事务
哪里不会点哪里.9 小时前
什么是 Spring Cloud?
后端·spring·spring cloud
让我上个超影吧10 小时前
天机学堂——BitMap实现签到
java·数据库·spring boot·redis·spring cloud
qq_4283890413 小时前
尚硅谷k8s自己实践步骤
spring cloud·kubernetes
短剑重铸之日1 天前
《SpringCloud实用版》 Config + Bus + Nacos 配置中心终极方案
后端·spring·spring cloud
小信丶1 天前
BlockExceptionHandler类介绍、应用场景和示例代码
java·spring boot·后端·spring·spring cloud
市安1 天前
去dockerHub搜索并拉取一个redis镜像
redis·spring cloud·docker·eureka
七夜zippoe2 天前
客户端负载均衡器深度解析 Spring Cloud LoadBalancer与Ribbon源码剖析
spring cloud·ribbon·负载均衡·loadbalancer·核心机制