问题
当设置fastjson为springboot的全局序列化工具后,当controller返回二进制字节流时,字节流被fastjson序列化为字符串了。
1 2 3 4
   | @RequestMapping(value = "/downloadInfo.json") public ResponseEntity<byte[]> xx(){     return xx; }
   | 
 


解决
fastjson默认的MediaType支持为全部,因此需要指定fastjson支持的MediaType。对于fastjson不支持的application/octet-stream使用ByteArrayHttpMessageConverter直接发送到前端。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
   | @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类型
1 2 3 4 5 6 7
   | @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); }
   | 
 

