2017-11-10 10 views
1

これはJAX-RSサーバーの一部で、別のサーバーからの応答を受け取り、同じ応答をクライアントに返します。JAX-RS Response.fromResponse(anotherResponse)がエンティティをコピーしないのはなぜですか?

このコピーanotherResponseからresponseForClientのエンティティ:

Response responseForClient = Response.fromResponse(anotherResponse).entity(anotherResponse.readEntity(InputStream.class)).build();

これは実体をコピーしません:

Response responseForClient = Response.fromResponse(anotherResponse).build();

もJAX-RSの応答として動作するはず秒1 .fromResponse()はエンティティもコピーする必要があります。

エンティティを設定する必要があるのはなぜですか?

私はRestEasy-3.0を使用しています。

答えて

1

fromResponseを呼び出す前に、応答をコピーするだけなので、InputStreamを消費する必要があります。 JAX-RSは、自動的にそれをしないだろう、とあなたは、クライアントに新しいインスタンスを提供する場合企業は

fromResponse

のpublic static Response.ResponseBuilder fromResponse(のマニュアルを参照してください消費されることはありません応答レスポンス)

既存のレスポンスのシャローコピーを実行して新しいResponseBuilderを作成します。 返されたBuilderには独自の応答ヘッダーがありますが、ヘッダー値は元のResponseインスタンスと共有されています。元の応答エンティティインスタンス参照は、新しい応答ビルダに設定されます。

エンティティが消費されない入力ストリームによってサポートされている場合、ストリームへの参照がコピーされることに注意してください。そのような場合は、元のレスポンス・インスタンスのエンティティ・ストリームをこのメソッドに渡す前にバッファリングしてください。


このコードはこのような場合には、」あなた

Response responseForClient = 
    Response.fromResponse(anotherResponse).entity(in).build() 
+0

に相当するバイト配列

InputStream is = anotherResponse.readEntity(InputStream.class); byte[] bytes = IOUtils.toByteArray(is); ByteArrayInputStream in= new ByteArrayInputStream (bytes); 

にInputStreamを読み取る応答をBufferエンティティストリームをバッファリングすることを確認してくださいこのメソッドに渡す前に元の応答インスタンスの " - どうすればいいですか?どの方法を呼びますか? Response.bufferEntity()を使ってみました。しかし、それはうまくいかなかった。 –

+0

更新された回答を見る – pedrofb

関連する問題