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; }