2016-08-24 91 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中,因此如果數據量巨大,則不會緩衝整個傳入流。

所以這是一個(非常簡單)解決我的問題,但如果任何人有其他建議,我很樂意聽到他們。