使用嵌套流对REST响应进行流式处理

使用嵌套流对REST响应进行流式处理,rest,jersey,jackson,streaming,jax-rs,Rest,Jersey,Jackson,Streaming,Jax Rs,我有一个场景,在实施和尝试不同的解决方案之前,我希望获得更广泛的投入 我正在实现的REST服务将服务于一个包含多个二进制数据字段和简单字符串的模型。一个简单的方法就是实现包含字符串、字节[]字段等的POJO。然后Jackson将使用base64为我序列化它。小菜一碟 但是我想把它作为一个流来服务。二进制字段将相当大,并且已经作为从我的服务中的另一个外部资源传入的流进行处理。因此,将它们读入字节数组,然后让jackson将它们转换为base64将带来不可接受的性能损失 也许我可以在POJO中简单地

我有一个场景,在实施和尝试不同的解决方案之前,我希望获得更广泛的投入

我正在实现的REST服务将服务于一个包含多个二进制数据字段和简单字符串的模型。一个简单的方法就是实现包含字符串、字节[]字段等的POJO。然后Jackson将使用base64为我序列化它。小菜一碟

但是我想把它作为一个流来服务。二进制字段将相当大,并且已经作为从我的服务中的另一个外部资源传入的流进行处理。因此,将它们读入字节数组,然后让jackson将它们转换为base64将带来不可接受的性能损失

也许我可以在POJO中简单地拥有OutputStream对象。这会让Jackson流式传输它(同时编码到base64)还是只会先读取整个流?也许杰克逊根本不支持这个

另一种选择可能是使用多部分响应,但不确定Jersey是否也会缓冲所有响应

或者唯一的方法是使用某种定制的jackson序列化程序? 我可以使用StreamingOutput执行此操作吗

如果它只是一个blob,我会简单地以八位字节流的形式返回它,我会很高兴,但正如前面提到的,我有一个包含几个二进制和非二进制字段的数据模型,我真的很想在一次调用中返回它


那你怎么说?实现我的目标最简单/最好的方法是什么?

因此,如果有人感兴趣,我找到了一种可行的方法

在DTO类中,我可以使用InputStream类型的字段,并将其设置为使用自定义序列化程序:

public class ModelDTO {
    private String someString;
    private String someOtherString;
    @JsonSerialize(using = InputStreamSerializer.class)
    private InputStream firstBlob;
    @JsonSerialize(using = InputStreamSerializer.class)
    private InputStream secondBlob;
...
}
public class InputStreamSerializer extends JsonSerializer<InputStream> {

    @Override
    public void serialize(InputStream inputStream, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeBinary(Base64Variants.MIME_NO_LINEFEEDS, inputStream, -1);
    }
}
和序列化程序:

public class ModelDTO {
    private String someString;
    private String someOtherString;
    @JsonSerialize(using = InputStreamSerializer.class)
    private InputStream firstBlob;
    @JsonSerialize(using = InputStreamSerializer.class)
    private InputStream secondBlob;
...
}
public class InputStreamSerializer extends JsonSerializer<InputStream> {

    @Override
    public void serialize(InputStream inputStream, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeBinary(Base64Variants.MIME_NO_LINEFEEDS, inputStream, -1);
    }
}
公共类InputStreamSerializer扩展JsonSerializer{
@凌驾
public void serialize(InputStream InputStream、JsonGenerator JsonGenerator、SerializerProvider SerializerProvider)引发IOException{
jsonGenerator.writeBinary(Base64Variants.MIME\u NO\u LINEFEEDS,inputStream,-1);
}
}
我还没有完全证实这一点,但从我所看到的,Jackson将只使用一个缓冲区将其写入OutputStream,因此,如果传入的流很大,就不会对整个流进行缓冲

所以这是一个(非常简单的)解决我问题的方法,但是如果有人有其他的建议,我很乐意听取