问题
当设置fastjson为springboot的全局序列化工具后,当controller返回二进制字节流时,字节流被fastjson序列化为字符串。
@ResponseBody
@RequestMapping(value = "/downloadInfo.json")
public ResponseEntity<byte[]> xx(){
return xx;
}
-
Preview
-
Response
解决
fastjson默认的MediaType支持为全部,因此需要指定fastjson支持的MediaType。对于fastjson不支持的application/octet-stream
使用ByteArrayHttpMessageConverter
直接发送到前端。
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
fastConverter.setFastJsonConfig(fastJsonConfig);
List<MediaType> supportedMediaTypes = new ArrayList<>();
supportedMediaTypes.add(MediaType.APPLICATION_JSON);
supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XML);
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,new ByteArrayHttpMessageConverter());
}
并controller层指定MediaType类型
@RequestMapping(value = "/downloadInfo.json")
public ResponseEntity<byte[]> xx(){
HttpHeaders headers = new HttpHeaders();
headers.setContentLength(buffer.length);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<>(buffer, headers, HttpStatus.OK);
}
-
Preview
-
Response