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。
