12

JAX-RS Web サービスで画像を返そうとしています。戻ることでこれを正常に機能させることができましたが、 for each リクエストFileInputStreamを作成することは避けたいと思います。File

私は Apache CXF と Jackson を使用しています (他のすべてのリソース メソッドは application/json を生成します)。

コードは次のようになります。

@GET
@Produces("image/png")
public Response getQrCode(@QueryParam("qrtext") String qrtext) {

    ByteArrayOutputStream out = QRCode.from(qrtext).to(ImageType.PNG).stream();

    return Response.ok(out).build();
}

残念ながら、これは恐ろしいものを生み出します:

org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor:376 - 応答クラス ByteArrayOutputStream のメッセージ本文ライターが見つかりませんでした。

これは同様の投稿へのリンクですが、私が遭遇している「メッセージ本文ライターがありません」という問題については言及されていません。

この問題に対処する方法についてのアイデアをいただければ幸いです。ありがとう!

4

2 に答える 2

25

StreamingOutputラッパーを使用するだけです。何らかの理由で不明ですが、ストリーミング出力を提供するのに最適です。:-)

于 2012-08-26T04:21:40.720 に答える
9

OutputStream ではなく、Response.ok(out) に画像を含む InputStream を提供する必要があると思います。(JAX-RS フレームワークは、InputStream からバイトを読み取り、それらを応答に配置します。OutputStream では一般的に何もできません)。

(あなたが CXF を使用していることは知っていますが、Jersey のドキュメント: http://jersey.java.net/nonav/documentation/latest/jax-rs.html#d4e324および JAX-RS 仕様により、フレームワークは MessageBodyWriter を提供する必要がありますInputStream の場合)。

編集: InputStreams が必要であることを知っているようです... QRCode クラスを制御できますか?

短期的には、次のことができる場合があります。

return Response.ok(out.toByteArray()).build();
于 2012-08-24T21:23:31.593 に答える