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。