2016-08-24 5 views
-1

私は、さまざまなソリューションを実装して試してみる前に、より広い入力をしたいというシナリオがあります。ストリーミングネストされたストリームのレスポンス

私が実装しているRESTサービスは、バイナリデータのいくつかのフィールドと単純な文字列を含むモデルを提供します。簡単な方法は、String、byte []フィールドなどを含むPOJOSを実装することです。ジャクソンはbase64を使用してそれをシリアル化します。ケーキの一片。

しかし、これをストリームとしてサービスしたいと思います。バイナリフィールドは非常に大きく、私のサービス内の別の外部リソースから入ってくるストリームとしてすでに処理されています。したがって、それらをバイト配列に読み込んだり、jacksonにそれらをbase64に変換させると、許容できないパフォーマンスヒットが発生します。

多分私はPOJO内にOutputStreamオブジェクトを持つことができます。それはJacksonが(base64にエンコードしている間に)ストリームを作りますか、それとも最初にストリーム全体を読み込むのでしょうか?おそらくジャクソンはこれをまったくサポートしないでしょうか?

もう1つの選択肢は、複数の部分からなる回答を使用している可能性がありますが、ジャージーもそれをすべてバッファリングしないことは確実ですか?

それを行う唯一の方法は、何らかの種類のカスタムジャクソンシリアライザを使用することですか? これを実行するためにStreamingOutputを使用できますか?

私は単純にそれをオクテットストリームとして返してうれしいですが、言及したように私はいくつかのバイナリフィールドと非バイナリフィールドを持つデータモデルを持っています。 1回の呼び出しで

あなたはどう言いますか?私の目的を達成する最も簡単な方法は何ですか?

答えて

0

誰かが興味を持っている場合、私は進めるための方法を見つけました。私はそれを完全に確認されていない

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; 
... 
} 

シリアライザ:私はInputStreamの種類のフィールドを使用してカスタム・シリアライザを使用するように設定することができDTOクラスで

しかし私が見ることから、ジャクソンはこれをバッファのみを使ってOutputStreamに書き込みます。したがって、巨大であれば入ってくるストリーム全体をバッファリングしません。

これは私の問題の(非常に単純な)解決策ですが、誰かが他の提案をしていれば私はそれらを聞くことができます。

関連する問題