Как управлять ошибкой «Невозможно вызвать getWriter(), getOutputStream() уже вызван» при использовании PdfWriter из bean-компонента

Я создаю несколько файлов PDF, используя itext в приложении jsf/primefaces. Некоторые файлы генерируются правильно, а некоторые нет. После некоторой отладки я обнаружил, что проблема вызывается определенной строкой кода.

Когда я звоню

writer.setPageEvent(new Footer(image));

где писатель имеет тип PdfWriter. Я получаю эти ошибки:

[org.primefaces.application.exceptionhandler.PrimeExceptionHandler] (default task-96) Could not handle exception!: java.lang.IllegalStateException: UT010006: Cannot call getWriter(), getOutputStream() already called

Чтобы получить экземпляр Pdf Writer, я использую следующие строки кода:

FacesContext fc = FacesContext.getCurrentInstance();
    ExternalContext ec = fc.getExternalContext();

    ec.responseReset(); // Some JSF component library or some Filter might
                        // have set some headers in the buffer beforehand.
                        // We want to get rid of them, else it may collide.
    ec.setResponseContentType(contentType); // Check
                                            // http://www.iana.org/assignments/media-types
                                            // for all types. Use if
                                            // necessary
                                            // ExternalContext#getMimeType()
                                            // for auto-detection based on
                                            // filename.
    // ec.setResponseContentLength(contentLength); // Set it with the file
    // size. This header is optional. It will work if it's omitted, but the
    // download progress will be unknown.
    ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

    OutputStream output = ec.getResponseOutputStream();

    // Now you can write the InputStream of the file to the above
    // OutputStream the usual way.
    Document document = new Document(PageSize.A4);

    PdfWriter writer = PdfWriter.getInstance(document, output);

Вместо этого я также пытался использовать HttpServletResponse:

HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
OutputStream output = httpServletResponse.getOutputStream();

но я получил ту же ошибку.

Как я могу решить эту проблему и написать прямо в PdfWriter? Или делать то же самое без PdfWriter?

Вы пробовали/перехватывали writer.setPageEvent(new Footer(image)); и смотрели, действительно ли он выдает ошибку?

Kukeltje 23.01.2019 14:01
"Невозможно вызвать getWriter(), getOutputStream() уже вызван" не является сообщением об исключении, связанным с PdfWriter, но звучит как исключение, обычно используемое классами, связанными с ответами, в структуре запрос-ответ (например, сервлетами). Таким образом, я предполагаю, что исключение возникает там, где, как вы предполагаете, оно затем перехватывается каким-то кодом обработки ошибок, который пытается получить ответный модуль записи, и это вызывает другое новое исключение, текст которого вы показываете. Пожалуйста, попробуйте явно поймать фактическое исключение и сообщить нам, что это сообщение и трассировка стека.
mkl 23.01.2019 14:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
701
0

Другие вопросы по теме