Java Spring ошибка при redirect

315
09 июня 2022, 15:50

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.
Answer 1

Судя по всему, response у вас закрывается PDFWriter-ом. Засим вы и не можете больше модифицировать оный.

Выход, согласно en-SO - указать редирект до использования PDFWriter так:

remform.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);
remform.setHeader("Location", targetURL);
READ ALSO
Method does not override method from its superclass

Method does not override method from its superclass

Пытаюсь понять в чем ошибка и на что ругается Android Studio в переопределении метода интерфейса, от которого имплементируюсь в данном классе

354
Применяется не тот класс CSS, который нужен

Применяется не тот класс CSS, который нужен

Не могу понять почему применяется внешнее правило CSS, a не внутреннее, <div class="Post_post__gI2Hu"> находится внутри <div class="Profile_content__3EemM">,...

349
Изменение переменной Flask

Изменение переменной Flask

Можно ли как то сделать так, чтобы при клике по кнопке на сайте менялась переменнаяПишу сайт через Flask на питоне

283
Как разделить footer, header и основу?

Как разделить footer, header и основу?

Кто в этом хорошо разбирается, подскажите как что сделать, хоть что-то из этого, с оставшимся (ну или поняв принцип работы), постараюсь сам...

363