Возвращение ZipInputStream в качестве объекта ответа Jax-RS - PullRequest
5 голосов
/ 09 января 2012

Я пытаюсь вернуть ZipInputStream, содержащий два разных выходных потока, в виде потока javax.ws.rs.core.Response.Когда я делаю вызов веб-службы для получения потока, я замечаю, что я получаю пустой поток обратно.Я пытался вернуть GZipInputStream раньше, и я получил ожидаемый поток на стороне клиента.Может ли быть проблема с ZipInputStream, которая мешает его правильному возвращению?Я использую javax 2.4 (servlet-api). Так выглядит моя служба 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();
 }

И это код, который вызывает службу.Я использую ось 1.4:

 HttpMethodBase getBillGroup = null;
 String id = "1234";
 String absoluteUrl = baseURL + BASE_SERVICE_PATH.replace("@id@",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

В последней строке itemA должен был быть первой записью, добавленной в поток в службе Jax-RS, но я получаю нулевое значение назад.Есть идеи, что может быть причиной этого?

1 Ответ

1 голос
/ 10 января 2012

В первом блоке используйте ByteArrayInputStream вместо ZipInputStream, что повторяет сложные записи zip.

...