Com o Spring 3.0, você pode usar o HttpEntity
objeto de retorno. Se você usar isso, seu controlador não precisará de um HttpServletResponse
objeto e, portanto, é mais fácil testar.
Exceto isso, essa resposta é relativa igual à do infeligo .
Se o valor de retorno da sua estrutura pdf for uma matriz de bytes (leia a segunda parte da minha resposta para outros valores de retorno) :
@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);
}
Se o tipo de retorno do seu PDF Framework ( documentBbody
) ainda não for uma matriz de bytes (e também não ByteArrayInputStream
), seria sensato NÃO torná-la uma matriz de bytes primeiro. Em vez disso, é melhor usar:
exemplo com 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);
}