OpenFeignClient用Object接收text/plain类型的返回报错

报错

Could not extract response: no suitable HttpMessageConverter found for response type [classxxxx] and content type [text/plain]

原因

返回类型Content-Type不是application/json,而是text/plain,无法反序列化成Object类型,如图 spring cloud OpenFeign本质上使用的是okHttpClient进行请求,如果是text/plain类型的返回会当成文本处理,无法像json字符串一样自动进行反序列化,下面是我的feinClient: 这种情况就需要对这种content-type的返回做兼容处理 添加Jackson2HttpMessageConverter转换类,同时增加text/plain,text/html返回类型的兼容

import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

import java.util.ArrayList;
import java.util.List;

/**
 * @author <a href="mailto:tangtongda@gmail.com">Tino.Tang</a>
 * @version ${project.version} - 2021/12/9
 */
public class MyJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
          
   

  public LokiJackson2HttpMessageConverter() {
          
   
    List<MediaType> mediaTypes = new ArrayList<>();
    mediaTypes.add(MediaType.TEXT_PLAIN);
    mediaTypes.add(MediaType.TEXT_HTML);
    setSupportedMediaTypes(mediaTypes);
  }
}

增加openFeign自定义配置,注入Decoder Bean

import feign.Logger;
import feign.codec.Decoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.SpringDecoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author <a href="mailto:tangtongda@gmail.com">Tino.Tang</a>
 * @version ${project.version} - 2021/11/29
 */
@Configuration
public class OpenFeignLogConfig {
          
   

  @Bean
  public Logger.Level feignLoggerLeave() {
          
   
    return Logger.Level.FULL;
  }

  @Bean
  public Decoder feignDecoder() {
          
   
    LokiJackson2HttpMessageConverter converter = new LokiJackson2HttpMessageConverter();
    ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(converter);
    return new SpringDecoder(objectFactory);
  }
}```

处理完后调用feign client就不会再报错了,无论类型是application/json还是text/plain,都可以正确反序列化成Object。
经验分享 程序员 微信小程序 职场和发展