В моем приложении springboot я пытаюсь вернуть PDF-файл с ResponseEntity-Resource-, чтобы имитировать службу. Поэтому я не могу изменить тип возвращаемого значения этого метода.
Мой код:
@RequestMapping(
value = "/pdf",
produces = MediaType.APPLICATION_PDF_VALUE,
method = RequestMethod.GET
)
public ResponseEntity<Resource> getpdf() {
try {
ClassPathResource pdfFile = new ClassPathResource("sample.pdf");
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*");
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET, POST, PUT");
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "Content-Type");
headers.add(HttpHeaders.CACHE_CONTROL, "no-cache, no-store, must-revalidate");
headers.add(HttpHeaders.PRAGMA, "no-cache");
headers.add(HttpHeaders.EXPIRES, "0");
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename = " + pdfFile.getFilename());
headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_PDF_VALUE);
log.info("pdfFile.contentLength() : " + pdfFile.contentLength());
return ResponseEntity
.ok()
.headers(headers)
//.contentLength(pdfFile.contentLength())
//.contentType(MediaType.APPLICATION_PDF)
.body(new InputStreamResource(pdfFile.getInputStream()));
} catch (IOException e) {
log.error("Couldn't serialize response for content type ", e);
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
Когда я пытаюсь вызвать это с помощью почтальона или чванства, у меня появляется 406 с заголовком ответа:
{
"date": "Fri, 02 Nov 2018 14:04:44 GMT",
"content-length": "0",
"content-type": null
}
Есть у кого-нибудь идеи?





Вы можете удалить produces = MediaType.APPLICATION_PDF_VALUE.
Нет необходимости добавлять produces = MediaType.APPLICATION_PDF_VALUE, в RequestMapping, поскольку кажется, что он пытается внутренне преобразовать ResponeBody.
Ниже приведена строка кода, которую вы уже используете.
headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_PDF_VALUE);
слишком сложно .. скачать файл намного проще
@GetMapping(value = "printing/",produces= MediaType.APPLICATION_PDF_VALUE)
public @ResponseBody byte[] print(@RequestParam("filterParam") String filterParam) {
try {
FileInputStream fis= new FileInputStream(new File("path to your file"));
byte[] targetArray = new byte[fis.available()];
fis.read(targetArray);
return targetArray;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
Я уже пробовал без
produces = MediaType.APPLICATION_PDF_VALUE, и у меня тоже 406, но с другим ответным сообщением: Response Body {"timestamp": "2018-11-02T14: 36: 21.094Z", "status": 406, "error": "Not Acceptable" "," message ":" Не удалось найти приемлемое представление "," path ":" / pdfs "} [Ответ Swagger без application / pdf] [1] [1]: i.stack.imgur.com/4vNkw.png Сproduces = MediaType.APPLICATION_PDF_VALUE: Тело ответа [объект Blob]