2016-08-24 92 views
-1

我有一个场景,我想在实现和尝试不同的解决方案之前获得更广泛的意见。流媒体REST响应与坐落流

我正在执行的REST服务将提供包含多个二进制数据字段和简单字符串的模型。一个简单的方法就是实现包含我的String,byte []字段的POJOS等。然后,Jackson将使用base64将其序列化。小菜一碟。

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

也许我可以简单地在我的POJO中有OutputStream对象。这是否会让杰克逊流过它(而编码为base64),还是只是首先读取整个流?也许杰克逊根本不支持这个?

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

或者唯一的方法是使用某种自定义杰克逊串行器? 我可以使用StreamingOutput来执行此操作吗?

如果它只是一个blob,我会简单地将它作为一个八位字节流返回并且很高兴,但正如前面提到的,我有一个包含几个二进制和非二进制字段的数据模型,我真的很想将它全部返回在一个电话。

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

回答

0

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

在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); 
    } 
} 

我还没有完全证实,但是从我看到的情况来看,Jackson只会使用一个缓冲区将其写入OutputStream中,因此如果数据量巨大,则不会缓冲整个传入流。

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