2012-08-24 22 views
9

JAX-RS web hizmetinde bir görüntü döndürmeye çalışıyorum. Bu başarılı bir şekilde FileInputStream döndürerek çalışabildim ancak her istek için bir File oluşturmaktan kaçınmayı tercih ediyorum.JAX-RS'den görüntü akışı olarak nasıl geri dönülür?

Apache CXF ve Jackson kullanıyorum (diğer tüm kaynak yöntemleri uygulama/json üretir).

Kod şöyle görünür:

org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor:

@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(); 
} 

Maalesef bu korkunç üretir 376 - Hayır mesajı vücut yazar olmuştur yanıt sınıfı ByteArrayOutputStream için bulundu.

Here's benzer bir konuya ait bir bağlantı ama ben içine çalıştırıyorum "Hayır ileti gövdesi yazar" sorunu söz etmez.

Bu sorunla nasıl başa çıkılacağına dair herhangi bir fikre değer veriyorum. Teşekkürler!

+0

Neden bir yanıtta sarmak yerine akışı doğrudan döndürmeyin? –

cevap

8

Bir OutputStream değil, Response.ok (dışarıda) görüntüsünü içeren bir InputStream sağlamanız gerektiğini düşünüyorum. (JAX-RS çerçeveniz, InputStream'den gelen baytları okuyacak ve bunları yanıtın üzerine koyacaktır, bir OutputStream ile genel olarak herhangi bir şey yapamaz)

(CXF'de olduğunuzu biliyorum, ancak Jersey'in dokümanı : http://jersey.java.net/nonav/documentation/latest/jax-rs.html#d4e324 ve JAX-RS özellikleriyle çerçeve, InputStream için bir MessageBodyWriter sağlamalıdır.)

Düzenleme: Görünüşe göre, gerekli olan InputStreams hakkında bilgi sahibi olursunuz ... QRCode sınıfı üzerinde denetiminiz var mı?

Kısa süreli yapmanız mümkün olabilir:

return Response.ok(out.toByteArray()).build(); 
+0

teşekkürler. cevabınız büyük bir yardım oldu. Response.ok (out.toByteArray()), build() güzel çalışır. – Justin

19

Sadece StreamingOutput sarmalayıcı kullanın. Bazı nedenlerden dolayı bilinmemektedir, ancak çıkış akışı sağlamak için GREAT. :-)

+0

Teşekkürler Tatu. Geri dönen StreamingOutput, bayt dizisini doğrudan Yanıt varlık olarak döndürmek için tercih edilir mi? – Justin

+0

Her zamanki gibi, "bağlıdır". Zaten baytınız varsa, muhtemelen hiç farketmez. – StaxMan

+6

Akımlar için temel olarak tüm akışı aktaracağından, akışlar için toByteArray kullanmak genellikle kötü bir fikirdir. Yani dosyanız 1GB ise, JVM'de en az 1GB'a ihtiyacınız olacak. Birden fazla kullanıcı hizmetinize erişiyorsa, her kullanıcı sunucunuzu aşağı çekecek ek bir 1GB ekleyecektir. Her zaman doğrudan akışları kullanmanızı öneririm. – apanosa

İlgili konular