2012-01-09 8 views
5

Estoy intentando devolver un ZipInputStream que contenga dos flujos de salida diferentes como un flujo javax.ws.rs.core.Response. Cuando realizo una llamada al servicio web para recuperar la transmisión, noto que recibo una transmisión vacía de nuevo. He intentado devolver un GZipInputStream antes, y he recibido la transmisión esperada en el lado del cliente. ¿Podría haber un problema con ZipInputStream que impida que se devuelva correctamente? estoy usando javax 2,4 (servlet-api) Así es como mi servicio JAX-RS se parece a (he simplificado un poco):Volviendo a ZipInputStream como un objeto de respuesta Jax-RS

@GET 
@Produces({"application/zip", MediaType.APPLICATION_XML}) 
public Response getZipFiles(@PathParam("id") final Integer id){ 

    //Get required resources here 
    ByteArrayOutputStream bundledStream = new ByteArrayOutputStream(); 
    ZipOutputStream out = new ZipOutputStream(bundledStream); 
    out.putNextEntry(new ZipEntry("Item A")); 
    out.write(outputStream.toByteArray()); 
    out.closeEntry(); 

    out.putNextEntry(new ZipEntry("Item B")); 
    out.write(defectiveBillOutputStream.toByteArray()); 
    out.closeEntry(); 

    out.close(); 
    bundledStream.close(); 

    ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(bundledStream.toByteArray())); 
    return Response.ok(zis).build(); 
} 

Y este es el código que llama al servicio. Estoy usando eje 1.4:

HttpMethodBase getBillGroup = null; 
String id = "1234"; 
String absoluteUrl = baseURL + BASE_SERVICE_PATH.replace("@[email protected]",id) ; 
getZip = new GetMethod(absoluteUrl); 

HttpClient httpClient = new HttpClient(); 
try { 
     httpClient.executeMethod(getZip); 
} 
catch (Exception e) { 
     LOGGER.error("Error during retrieval " + e.getMessage()); 

} 

InputStream dataToConvert = getZip.getResponseBodyAsStream(); 
ZipInputStream in = new ZipInputStream(dataToConvert); 
ZipEntry itemA = in.getNextEntry(); 
//Do more things 

En la última línea, ITEMA debería haber sido la primera entrada a la corriente en el servicio JAX-RS, pero estoy consiguiendo un nulo espalda. ¿Alguna idea de lo que podría estar causando esto?

Respuesta

1

En el primer bloque, utilice ByteArrayInputStream en lugar de ZipInputStream, que itera las entradas zip complejas.

+0

Sí! Gracias. Esto funciona. Estoy recuperando algunos datos (Anteriormente, todo lo que obtenía era una transmisión vacía). ¿Sabes cómo convertiría la secuencia en el segundo bloque e iteraría a través de zipentries ahora? El código tal como está todavía devuelve nulo en la última línea. – theseeker

+0

Ok, simplemente hice esto: ZipInputStream in = new ZipInputStream (getZip.getResponseBodyAsStream()); y obtengo mi artículoA y artículoB. ¡Gracias por tu ayuda! – theseeker

+0

'@ Produces' parece mejor sin el parámetro MediaType.APPLICATION_XML (no estoy seguro). Y en lugar de la secuencia, puede intentar pasar el byte [] como parámetro de entidad a 'ok'. _No tengo experiencia. _ Primero podrías intentar descargarlo como InputStream binario, i.o. ZipInputStream, para intentarlo. –

Cuestiones relacionadas