Spring MVC中的流JSON输出
我的应用程序是使用Spring boot(1.3.3.RELEASE)和spring mvc,spring data jpa hibernate构建的。 MySql是数据库,Jackson是Json序列化器。 在java 8上。
我想在我的控制器方法中返回一个庞大的数据集。 我想要返回如下所示的对象流,而不是检索所有数据然后传入jackson序列化器。
@RequestMapping(value = "/candidates/all", method = RequestMethod.GET) public Stream getAllCandidates(){ try { return candidateDao.findAllByCustomQueryAndStream(); } catch(Exception e){ LOG.error("Exception in getCandidates",e); } return null; }
我的DAO如下:
@Query("select c from Candidate c") public Stream findAllByCustomQueryAndStream();
但是,Jackson正在序列化流对象而不是流的内容。 实际输出如下:
{"parallel" : false}
如何指示Jackson序列化内容而不是流对象?
多亏了这一点,我才能解决这个问题。
我提供了一个自定义的httpMessageConverter,它了解如何处理流。 像这样:
@Bean public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(); ObjectMapper objectMapper =jsonConverter.getObjectMapper(); SimpleModule module = new SimpleModule("Stream"); module.addSerializer(Stream.class, new JsonSerializer() { @Override public void serialize(Stream value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException { serializers.findValueSerializer(Iterator.class, null) .serialize(value.iterator(), gen, serializers); } }); objectMapper.registerModule(module); jsonConverter.setObjectMapper(objectMapper); return jsonConverter; }
在https://github.com/FasterXML/jackson-modules-java8/issues/3上有一个建议的解决方案,这可能是更好的方法。
我不会在这里粘贴代码,因为它可能会在该问题中得到更新。
到目前为止,我没有发现任何问题,我已经添加了其他模块,如Jdk8Module for Optional as
jacksonObjectMapper.registerModule(new StreamModule());
我发现这种添加对流的支持的方式破坏了LocalDate / LocalDateTime的良好输出,最终这样做:
@Bean public Module customModule() { SimpleModule module = new SimpleModule("Stream"); module.addSerializer(Stream.class, new JsonSerializer() { @Override public void serialize(Stream value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException { serializers.findValueSerializer(Iterator.class, null) .serialize(value.iterator(), gen, serializers); } }); return module; }