Я пытаюсь вернуть 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, но я получаю нуль назад. Любая идея, что может быть причиной этого?
Да! Спасибо. Это работает. Я возвращаю некоторые данные (Раньше у меня был пустой поток). Знаете ли вы, как я буду преобразовывать поток во второй блок и теперь итерации через zipentries? Код, который он стоит, возвращает значение null в последней строке. – theseeker
Ok только что сделал: ZipInputStream in = new ZipInputStream (getZip.getResponseBodyAsStream()); , и я получаю свой itemA и itemB. Спасибо за вашу помощь! – theseeker
'@ Produces' кажется лучше без параметра MediaType.APPLICATION_XML (не уверен). И вместо потока вы можете попробовать передать байту [] как параметр сущности в 'ok'. _I не опытный. Вы можете сначала попробовать загрузить его как двоичный InputStream, т.е. ZipInputStream, попробовать. –