Spring MVC中的流JSON输出

Vas*_*sco 10 java rest spring-mvc jackson java-stream

我的应用程序是使用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<Candidate> getAllCandidates(){
    try { 
        return candidateDao.findAllByCustomQueryAndStream();
    } catch(Exception e){
        LOG.error("Exception in getCandidates",e);
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

我的DAO如下:

@Query("select c from Candidate c")
public Stream<Candidate> findAllByCustomQueryAndStream();
Run Code Online (Sandbox Code Playgroud)

但是,Jackson正在序列化流对象而不是流的内容.实际输出如下:

{"parallel" : false}
Run Code Online (Sandbox Code Playgroud)

如何指示Jackson序列化内容而不是流对象?

Vas*_*sco 13

多亏了这一点,我才能解决这个问题.

我提供了一个自定义的httpMessageConverter,它了解如何处理流.像这样:

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
 MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
 ObjectMapper objectMapper =jsonConverter.getObjectMapper();
 SimpleModule module = new SimpleModule("Stream");
 module.addSerializer(Stream.class, new JsonSerializer<Stream>() {


    @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;
}
Run Code Online (Sandbox Code Playgroud)