问题
当设置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); }
|