В Spring 3.0 вы можете использовать возвращаемый объект HttpEntity
.Если вы используете это, то вашему контроллеру не нужен объект HttpServletResponse
, и, следовательно, его проще тестировать. Кроме этого, этот ответ является относительным равным ответу Infeligo .
Если возвращаемое значение вашей pdf-структуры представляет собой байтовый массив (прочитайте вторую часть моего ответа длядругие возвращаемые значения) :
@RequestMapping(value = "/files/{fileName}", method = RequestMethod.GET)
public HttpEntity<byte[]> createPdf(
@PathVariable("fileName") String fileName) throws IOException {
byte[] documentBody = this.pdfFramework.createPdf(filename);
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_PDF);
header.set(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=" + fileName.replace(" ", "_"));
header.setContentLength(documentBody.length);
return new HttpEntity<byte[]>(documentBody, header);
}
Если тип возвращаемого значения вашей PDF Framework (documentBbody
) уже не является байтовым массивом (а также нет ByteArrayInputStream
) тогда было бы разумно НЕ сделать сначала массив байтов.Вместо этого лучше использовать:
пример с FileSystemResource
:
@RequestMapping(value = "/files/{fileName}", method = RequestMethod.GET)
public HttpEntity<byte[]> createPdf(
@PathVariable("fileName") String fileName) throws IOException {
File document = this.pdfFramework.createPdf(filename);
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_PDF);
header.set(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=" + fileName.replace(" ", "_"));
header.setContentLength(document.length());
return new HttpEntity<byte[]>(new FileSystemResource(document),
header);
}