2012-01-09 3 views
5

Я пытаюсь вернуть ZipInputStream, содержащий два разных выходных потока, как поток javax.ws.rs.core.Response. Когда я делаю вызов веб-службы для извлечения потока, я замечаю, что получаю пустой поток обратно. Я попытался вернуть GZipInputStream раньше, и я получил ожидаемый поток на стороне клиента. Может ли быть проблема с ZipInputStream, которая не позволяет ему правильно возвращаться? Я использую javax 2.4 (сервлет-API) Это как мой JAX-RS сервис выглядит как (я упростил его немного):Возврат ZipInputStream как объекта ответа 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("@[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 

На последней строке, Itema должна была первая запись добавляется к потоку в Службе JAX-RS, но я получаю нуль назад. Любая идея, что может быть причиной этого?

ответ

1

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

+0

Да! Спасибо. Это работает. Я возвращаю некоторые данные (Раньше у меня был пустой поток). Знаете ли вы, как я буду преобразовывать поток во второй блок и теперь итерации через zipentries? Код, который он стоит, возвращает значение null в последней строке. – theseeker

+0

Ok только что сделал: ZipInputStream in = new ZipInputStream (getZip.getResponseBodyAsStream()); , и я получаю свой itemA и itemB. Спасибо за вашу помощь! – theseeker

+0

'@ Produces' кажется лучше без параметра MediaType.APPLICATION_XML (не уверен). И вместо потока вы можете попробовать передать байту [] как параметр сущности в 'ok'. _I не опытный. Вы можете сначала попробовать загрузить его как двоичный InputStream, т.е. ZipInputStream, попробовать. –

Смежные вопросы