Spring REST - 通过请求传递 PDF
Spring REST - pass PDF through a request
我有 2 个 Spring 启动应用程序...
第一个应用程序应该生成一个 PDF 并 return 它...第二个应用程序正在调用第一个应用程序以获取 pdf 并 return 它给用户...
这里我正在生成一个 pdf。
@RequestMapping(value = "/html2pdf", method = RequestMethod.GET)
public ResponseEntity<InputStreamResource> report(@RequestParam() String htmlContent) {
try {
ByteArrayInputStream pdfDocument = pdfGenerator.generatePDF(htmlContent);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_PDF);
headers.add("Content-Disposition", "inline; filename=generated.pdf");
return ResponseEntity
.ok()
.headers(headers)
.body(new InputStreamResource(pdfDocument));
} catch (IOException e) {
return ResponseEntity.badRequest().build();
}
}
我在这里尝试调用第一个应用程序和 return pdf...
@RequestMapping(value = "/pdfreport", method = RequestMethod.GET)
public ResponseEntity<InputStreamResource> report() {
ResourceHttpMessageConverter resourceHttpMessageConverter = new ResourceHttpMessageConverter();
List<MediaType> supportedApplicationTypes = new ArrayList<>();
MediaType pdfApplication = new MediaType("application", "pdf");
supportedApplicationTypes.add(pdfApplication);
resourceHttpMessageConverter.setSupportedMediaTypes(supportedApplicationTypes);
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
messageConverters.add(resourceHttpMessageConverter);
RestTemplate pdfGenerator = new RestTemplate();
pdfGenerator.setMessageConverters(messageConverters);
ResponseEntity<InputStreamResource> response = pdfGenerator.getForEntity("http://localhost:1080/pdf-generator/html2pdf?htmlContent=<h2>HUHU</h2>", InputStreamResource.class);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "inline; filename=generated.pdf");
headers.setContentType(MediaType.APPLICATION_PDF);
return ResponseEntity
.ok()
.headers(headers)
.body(response.getBody());
}
在这个星座中我得到以下错误:
java.io.IOException: stream is closed
我已经用 ResponseExtractor 试过了...
这里有什么问题?我怎样才能更容易地解决它?
谢谢
InputStreamResource 仅应在没有其他特定 Resource 实现适用时使用。特别是,尽可能使用 ByteArrayResource 或任何基于文件的 Resource 实现。
我有 2 个 Spring 启动应用程序... 第一个应用程序应该生成一个 PDF 并 return 它...第二个应用程序正在调用第一个应用程序以获取 pdf 并 return 它给用户...
这里我正在生成一个 pdf。
@RequestMapping(value = "/html2pdf", method = RequestMethod.GET)
public ResponseEntity<InputStreamResource> report(@RequestParam() String htmlContent) {
try {
ByteArrayInputStream pdfDocument = pdfGenerator.generatePDF(htmlContent);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_PDF);
headers.add("Content-Disposition", "inline; filename=generated.pdf");
return ResponseEntity
.ok()
.headers(headers)
.body(new InputStreamResource(pdfDocument));
} catch (IOException e) {
return ResponseEntity.badRequest().build();
}
}
我在这里尝试调用第一个应用程序和 return pdf...
@RequestMapping(value = "/pdfreport", method = RequestMethod.GET)
public ResponseEntity<InputStreamResource> report() {
ResourceHttpMessageConverter resourceHttpMessageConverter = new ResourceHttpMessageConverter();
List<MediaType> supportedApplicationTypes = new ArrayList<>();
MediaType pdfApplication = new MediaType("application", "pdf");
supportedApplicationTypes.add(pdfApplication);
resourceHttpMessageConverter.setSupportedMediaTypes(supportedApplicationTypes);
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
messageConverters.add(resourceHttpMessageConverter);
RestTemplate pdfGenerator = new RestTemplate();
pdfGenerator.setMessageConverters(messageConverters);
ResponseEntity<InputStreamResource> response = pdfGenerator.getForEntity("http://localhost:1080/pdf-generator/html2pdf?htmlContent=<h2>HUHU</h2>", InputStreamResource.class);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "inline; filename=generated.pdf");
headers.setContentType(MediaType.APPLICATION_PDF);
return ResponseEntity
.ok()
.headers(headers)
.body(response.getBody());
}
在这个星座中我得到以下错误:
java.io.IOException: stream is closed
我已经用 ResponseExtractor 试过了...
这里有什么问题?我怎样才能更容易地解决它?
谢谢
InputStreamResource 仅应在没有其他特定 Resource 实现适用时使用。特别是,尽可能使用 ByteArrayResource 或任何基于文件的 Resource 实现。