我的应用程序是使用 Spring Boot(1.3.3.RELEASE) 和 Spring MVC、Spring data JPA Hibernate 构建的。 MySql 是数据库,Jackson 是 JSON 序列化程序。在 Java 8 上。
我想在我的 Controller 方法中返回一个巨大的数据集。我不想检索所有数据然后传递给 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;
}
我的 DAO 如下所示:
@Query("select c from Candidate c")
public Stream<Candidate> findAllByCustomQueryAndStream();
但是,Jackson 正在序列化流对象而不是流的内容。实际输出如下:
{"parallel" : false}
我如何指示 Jackson 序列化内容而不是流对象?
最佳答案
感谢this我能够解决这个问题。
我提供了一个了解如何处理流的自定义 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;
}
关于java - 在 Spring MVC 中流式传输 JSON 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37155557/