Bir javax.ws.rs.core.Response Akışı olarak iki farklı çıktı akışını içeren bir ZipInputStream döndürmeye çalışıyorum. Akışı almak için bir web servisi çağrısı yaptığımda, boş bir akış aldığımı fark ettim. Daha önce bir GZipInputStream döndürmeyi denedim ve istemci tarafında beklenen akışı aldım. ZipInputStream ile düzgün bir şekilde döndürülmesini engelleyen bir sorun olabilir mi? Ben 2.4 (servlet-api) javax kullanıyorum Bu benim jax-rs servisi (ben biraz onu basitleştirilmiş var) gibi görünüyor:ZipInputStream bir Jax-RS Yanıt nesnesi olarak döndürme
@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();
}
Ve bu hizmeti çağrıları koddur. Ben eksenini 1.4 kullanıyorum: Geçen satırda
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 ilk giriş Jax-RS Servisi akışına eklenir olmalıydı, ama geri bir boş alıyorum. Buna neden olabilecek bir fikrin var mı?
Evet! Teşekkür ederim. Bu çalışıyor. Biraz veri alıyorum (Önceden sahip olduğum tek şey boş bir dere idi). Akışı ikinci blokta nasıl dönüştüreceğimi biliyor muydunuz ve şimdi zipentries üzerinden yinelemeliyim? Durduğu kod hala son satırda null değerini döndürür. – theseeker
Tamam, bunu yaptım: ZipInputStream = yeni ZipInputStream (getZip.getResponseBodyAsStream()); ve itemA ile itemB'yi aldım. Yardım ettiğin için teşekkür ederim! – theseeker
'@ Produces' MediaType.APPLICATION_XML parametresi (emin değil) olmadan daha iyi görünüyor. Ve akış yerine, bayt [] varlık parametresini 'ok' olarak geçirmeyi deneyebilirsiniz. _Ben deneyimli değil.İlk olarak indirip, DoubleClick, i.o. olarak indirmeyi deneyebilirsiniz. ZipInputStream, denemek. –