Web приложение на Spring Web. Обработчик, по мимо всего прочего, формирует pdf документ, и передаёт на скачивание. Всё без исключения работает, но не срабатывает return "redirect:/search"; Если удаляю код с формированием документа, то редирект срабатывает и никаких ошибок.
@PostMapping("/removes")
public String removes (@RequestParam Long id,
@RequestParam String invid,
MultipartFile file, HttpServletResponse remform, Map<String, Object> model) throws IOException{
Message messagedel = new Message(id);
Streamable<Message> messag;
messag = messageRepo.findByInvid(invid);
final String FONT = "fonts/segoeuisl.ttf";
BaseFont bf = BaseFont.createFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font = new Font(bf, 12, Font.NORMAL);
remform.setContentType("application/pdf");
String headerKey = "Content-Disposition";
String headerValue = "attachment; filename=destroy.pdf";
remform.setHeader(headerKey, headerValue);
Document document = new Document(PageSize.A4.rotate());
PdfWriter.getInstance(document, remform.getOutputStream());
document.open();
document.add(new Paragraph("Акт", font));
PdfPTable table = new PdfPTable(3);
table.setWidthPercentage(100);
Stream.of("Наименование", "Инв. №", "Инициатор")
.forEach(columnTitle -> {
PdfPCell head = new PdfPCell();
head.setPadding(5);
head.setHorizontalAlignment(1);
head.setPhrase(new Phrase(columnTitle, font));
table.addCell(head);
});
for (Message mess : messag) {
table.addCell(mess.getText());
table.addCell(mess.getInvid());
table.addCell(GetDn.displayName);
}
document.add(table);
document.close();
messageRepo.deleteById(id);
journalFind.deleteByMessageid(id);
model.put("messages", messagedel);
return "redirect:/search";
}
Ошибка:
ERROR 19644 --- [nio-8080-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed] with root cause
java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed
ERROR 19644 --- [nio-8080-exec-9] s.e.ErrorMvcAutoConfiguration$StaticView : Cannot render error page for request [/removes] and exception [] as the response has already been committed. As a result, the response may have the wrong status code.
Судя по всему, response
у вас закрывается PDFWriter-ом. Засим вы и не можете больше модифицировать оный.
Выход, согласно en-SO - указать редирект до использования PDFWriter так:
remform.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);
remform.setHeader("Location", targetURL);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Пытаюсь понять в чем ошибка и на что ругается Android Studio в переопределении метода интерфейса, от которого имплементируюсь в данном классе
Не могу понять почему применяется внешнее правило CSS, a не внутреннее, <div class="Post_post__gI2Hu"> находится внутри <div class="Profile_content__3EemM">,...
Можно ли как то сделать так, чтобы при клике по кнопке на сайте менялась переменнаяПишу сайт через Flask на питоне
Кто в этом хорошо разбирается, подскажите как что сделать, хоть что-то из этого, с оставшимся (ну или поняв принцип работы), постараюсь сам...