java - 在 Spring MVC 中流式传输 JSON 输出

标签 java rest spring-mvc jackson java-stream

我的应用程序是使用 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/

相关文章:

Java - 引用 "to be resolved later"

java - 使用android studio在android中通过单击java中的媒体播放器按钮来播放声音

node.js - Node 服务器上的间歇性 EAI_AGAIN 错误

java - 对于同一个 REST 方法,我们可以有多个 @Path 注释吗

java - 如何在java中减小多部分文件的大小

java - 在 Spring Boot 中创建路径

java - 如何将数据库中的大量数据存储到 XML(内存问题,第二部分)?

java - 无法使用 Spring Boot 将简单的 "Hello World"消息发送到 RabbitMQ 队列

scala - 在 Gatling 场景和模拟之间传递参数

spring - 如何在Spring Expression Language(SpEL)中连接两个字符串