SpringCloud OpenFeign调用返回text/html接口无合适HttpMessageConverter报错如何解决
问题根因
报错的核心原因是Spring默认的
MappingJackson2HttpMessageConverter仅支持application/json、application/*+json等JSON类媒体类型的响应解析,你调用的第三方接口返回的Content-Type: text/html不在该转换器的支持列表中,因此无法匹配到合适的转换器将响应反序列化为你定义的MyCustomRespone实体。
你引入的feign-jackson依赖本身是提供Feign的Jackson编解码能力,但它默认也只会处理JSON类型的响应,不会自动适配text/html类型,因此引入后问题仍然存在。
解决方案
推荐按优先级选择以下方案:
方案1:仅给指定Feign客户端配置自定义解码器(无全局侵入,最推荐)
你可以单独为目标Feign客户端自定义解码器,给Jackson转换器新增text/html类型支持,不会影响项目其他接口的解析逻辑:
- 自定义Feign配置类:
import feign.codec.Decoder; import org.springframework.http.MediaType; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.cloud.openfeign.support.SpringDecoder; import org.springframework.beans.factory.ObjectFactory; import org.springframework.http.converter.HttpMessageConverters; import java.util.List; public class TextHtmlFeignConfig { @Bean public Decoder textHtmlFeignDecoder() { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); // 扩展支持text/html类型的响应解析 converter.setSupportedMediaTypes(List.of( MediaType.APPLICATION_JSON, MediaType.TEXT_HTML )); ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(converter); return new SpringDecoder(objectFactory); } }
- 修改FeignClient注解,绑定自定义配置(注意修正你原代码中引号缺失的语法错误):
@FeignClient(name = "test", url = "/test", configuration = TextHtmlFeignConfig.class) public interface MyFeignClient { @GetMapping("/hello") MyCustomRespone getValuesFromOtherService(@RequestParam String name, @RequestParam int id); }
方案2:全局扩展消息转换器(适合项目内多个接口都返回text/html的场景)
如果你项目里有多个接口都返回text/html格式的JSON内容,可以直接全局扩展Spring MVC的消息转换器:
import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setSupportedMediaTypes(List.of( MediaType.APPLICATION_JSON, MediaType.TEXT_HTML )); converters.add(0, converter); } }
兜底方案:手动解析响应
如果不想调整框架配置,可以把Feign接口返回值改为String,拿到响应字符串后手动用ObjectMapper转成实体:
@FeignClient(name = "test", url = "/test") public interface MyFeignClient { @GetMapping("/hello") String getValuesFromOtherService(@RequestParam String name, @RequestParam int id); }
调用处转换:
@Autowired private ObjectMapper objectMapper; public MyCustomRespone callService(String name, int id) throws JsonProcessingException { String resp = myFeignClient.getValuesFromOtherService(name, id); return objectMapper.readValue(resp, MyCustomRespone.class); }
内容的提问来源于stack exchange,提问作者Liem
相关产品推荐
相关产品推荐

