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);
    }
}
相关推荐
南昌彭于晏2 小时前
springcloud+openFeign单元测试解决初始化循环依赖的问题
spring·spring cloud·单元测试
⑩-7 小时前
服务注册与发现的原理?Nacos vs Eureka?
spring cloud·云原生·eureka
SmartBrain8 小时前
基于SpringAI架构的多智能体协作(进阶版)
人工智能·spring boot·python·spring cloud
qingwufeiyang_5309 小时前
Nacos学习笔记
java·笔记·学习·spring cloud·服务发现
小江的记录本1 天前
【Spring Boot—— .yml(YAML)】Spring Boot中.yml文件的基础语法、高级特性、实践技巧
xml·java·spring boot·后端·spring·spring cloud·架构
xiaolingting1 天前
Gateway 网关流控与限流架构指南
spring cloud·架构·gateway·sentinel
唯一世1 天前
Open Feign最佳实践
java·spring cloud
Don.TIk2 天前
SpringCloud学习笔记
笔记·学习·spring cloud
z_鑫2 天前
SpringCloud FeignClient 中 Bean 重复注册冲突解决方案解析
java·spring boot·spring cloud
孫治AllenSun2 天前
【线程池】优化等待队列和拒绝策略
java·spring boot·spring cloud