3 回答
TA贡献1951条经验 获得超3个赞
这个问题并不能完全解决。不允许HttpServletResponse
在设置后删除任何标头,因此我必须在响应更改之前(之前response.setHeader("Content-Disposition",..
)移动渲染。这允许正常抛出异常。
TA贡献1811条经验 获得超6个赞
问题是由于您没有以正确的方式处理异常,以便使用适合您的项目需求的正确方法。
这是一个可能的解决方案。
首先,您必须在您的方法中进行此更改。
@GetMapping("/salary-report/{id}")
public void generateSalaryReport(@PathVariable("id") long salaryReportId, HttpServletResponse response) throws IOException {
JasperPrint jasperPrint;
var salaryReport = salaryReportRepositoryEx.findById(salaryReportId).orElseThrow(ResourceNotFoundException::new);
try (OutputStream out = response.getOutputStream()) {
HashMap<String, Object> parameters = new HashMap<>();
parameters.put("ReportId", salaryReport.getId());
// Set meta data
response.setContentType("application/x-download");
response.setHeader(
"Content-Disposition",
String.format("attachment; filename=\"%s%s-report%s-%s-%s.pdf\"",
.... parameters
)
);
// Set report
jasperPrint = salaryReportJasperReport.render(parameters); // exception usually here
JasperExportManager.exportReportToPdfStream(jasperPrint, out);
} catch (Exception e) {
throw new IOException("Salary report generation failed for id: " + salaryReportId);
}
}
他们将此方法添加到您的控制器中。
@ExceptionHandler(IOException.class )
public ResponseEntity<String> handleAccessDeniedException(IOException ex) {
//TODO Log your exception with a logging framework
return new ResponseEntity<String>(ex.getMessage, HttpStatus.INTERNAL_SERVER_ERROR);
}
添加回答
举报