描述:微服务使用feign调用报表接口,报表为iText7生成的pdf,return类型应为Byte[],消费端抛 JSON parse error异常。
猜测:序列化为FastJson方式导致异常。
debug:在创建 FastJsonHttpMessageConverter 时 默认会设置MediaType.ALL ,在AbstractHttpMessageConverter .write 过程中 会判断 Content-Type 中不能有通配符导致报错。
解决:
1. feign接口添加
consumes = MediaType.APPLICATION_JSON_VALUE
2. 添加配置类
public class WebMvcConfigurerImpl implements WebMvcConfigurer {
@Bean
public HttpMessageConverters fastjsonHttpMessageConverter() {
// 定义一个转换消息的对象
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
// 添加fastjson的配置信息 比如 :是否要格式化返回的json数据
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
// 在转换器中添加配置信息
fastConverter.setFastJsonConfig(fastJsonConfig);
List<MediaType> supportedMediaTypes = new ArrayList<>(23);
supportedMediaTypes.add(MediaType.APPLICATION_JSON);
supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
supportedMediaTypes.add(MediaType.APPLICATION_CBOR);
supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
supportedMediaTypes.add(MediaType.APPLICATION_PDF);
supportedMediaTypes.add(MediaType.APPLICATION_PROBLEM_JSON);
supportedMediaTypes.add(MediaType.APPLICATION_PROBLEM_XML);
supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
supportedMediaTypes.add(MediaType.APPLICATION_STREAM_JSON);
supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XML);
supportedMediaTypes.add(MediaType.IMAGE_GIF);
supportedMediaTypes.add(MediaType.IMAGE_JPEG);
supportedMediaTypes.add(MediaType.IMAGE_PNG);
supportedMediaTypes.add(MediaType.MULTIPART_FORM_DATA);
supportedMediaTypes.add(MediaType.MULTIPART_MIXED);
supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
supportedMediaTypes.add(MediaType.TEXT_HTML);
supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
supportedMediaTypes.add(MediaType.TEXT_PLAIN);
supportedMediaTypes.add(MediaType.TEXT_XML);
fastConverter.setSupportedMediaTypes(supportedMediaTypes);
HttpMessageConverter<?> converter = fastConverter;
return new HttpMessageConverters(converter);
}
}
总之,服务提供者接收类型应与消费者序列化对象一致。