如何将Java对象作为JSON(jackson)流式传输到http响应(Jersey)?

如何将Java对象作为JSON(jackson)流式传输到http响应(Jersey)?,json,rest,stream,jersey,jackson,Json,Rest,Stream,Jersey,Jackson,我正在使用Jersey和Jackson提供的JSON REST API开发Java服务器。代码可以归结为如下内容: @GET @Path("/data") @ManagedAsync public void getData(@Suspended final AsyncResponse response) { Stream<MyDataObject> dataStream = myDataBase.getData(); // How to stream the dat

我正在使用Jersey和Jackson提供的JSON REST API开发Java服务器。代码可以归结为如下内容:

@GET
@Path("/data")
@ManagedAsync
public void getData(@Suspended final AsyncResponse response) {
    Stream<MyDataObject> dataStream = myDataBase.getData();

    // How to stream the data to the client 
    // instead of collecting it in a List first?
    List<MyDataObject> data = dataStream.collect(Collectors.toList());

    response.resume(Response.ok(data).build());
}
@GET
@路径(“/data”)
@ManagedAsync
public void getData(@Suspended final AsyncResponse){
Stream dataStream=myDataBase.getData();
//如何将数据流传输到客户端
//而不是先在列表中收集?
List data=dataStream.collect(Collectors.toList());
response.resume(response.ok(data.build());
}
在将数据发送到客户端之前,我们不想在
列表中收集数据,而是希望将结果流式传输到客户端,因为对象的数量可能很大。从google和stackoverflow上的搜索中,我发现我可能需要
流输出
,但我不知道如何通过Jackson将流连接到Jersey


简言之:如何将结果从数据库直接流式传输到客户端?

请大胆思考:我可能会尝试编写自己的for stream,使用ObjectMapper来处理流和每个值。对于Streams和Jackson,有一些解决方案涉及到编写自己的序列化程序。这将获得输出,但我不确定这将如何满足流媒体要求。您不必使用MessageBodyWriter。您可以使用StreamingOutput。流量输出真的没有什么特别的。这就像写入MessageBodyWriter的输出流。实际上,我认为ObjectMapper在这种情况下不起作用。您将需要使用Jackson流式API。您需要获得一个JsonGenerator,以便编写开始数组和结束数组。看见当然,如果您不使用自定义序列化程序,您需要创建自己的生成器。谢谢@peeskillet,我认为您是对的。我想我必须自己实现这个管道来连接流和流输出。我真的很惊讶,看起来我是第一个尝试这样做的人,这听起来像是一个常见的用例:我可以找到零个库,几乎没有任何关于这方面的教程或示例:(.这里有一个教程,但我认为会很有用:。