Перенаправление в @PostConstruct вызывает исключение IllegalStateException

Я хочу сделать переадресацию в моем @PostConstruct в 4 моей поддержке beans. Как я узнал из последующего вопроса: Обработка JSF PostConstruct Exception - перенаправление Я знаю, что я должен использовать:

    @PostConstruct
    public void init() {    
       if (shouldRedirect) {
          try { 
             FacesContext.getCurrentInstance().getExternalContext().redirect("bolagsSok_company.xhtml");
             return;
          } catch (IOException e) {
             //do nothing
          }
        }
        ....
     }

Это отлично работает для 2 моих резервных копий beans... но для остальных двух файл non-redirected-xhtml по-прежнему вызывает вызовы в резервную копию bean и не перенаправляет. Я подтвердил (с отладкой), что поддержка beans действительно вызывает оба FacesContext.getCurrentInstance().getExternalContext().redirect("bolagsSok_company.xhtml"); и возвращает; заявления.

Любые подсказки, что может быть неправильным?

Ответ 1

Перенаправление в @PostConstruct может быть слишком запоздалым, если ответ уже сделан. То есть когда первые несколько байтов ответа уже отправлены клиенту. Это точка невозврата. Это может быть в вашем случае, когда базовый bean ссылается (и таким образом сконструирован) впервые относительно поздно в представлении, возможно, примерно на полпути или в конце.

Вы можете решить эту проблему одним из следующих способов:

  • Ссылка на bean в первый раз как можно раньше в представлении.

  • Используйте <f:event type="preRenderView"> вместо @PostConstruct. Это вызовет метод непосредственно перед началом отклика рендера (таким образом, прежде чем какой-либо бит будет отправлен на ответ). Или, если вы уже используете JSF 2.2, используйте <f:viewAction>. Дополнительным преимуществом является то, что <f:viewAction> может возвращать результат действия для навигации, например return bolagsSok_company?faces-redirect=true", без необходимости возиться с ExternalContext#redirect().

  • Увеличьте размер буфера Facelets по умолчанию javax.faces.FACELETS_BUFFER_SIZE в параметре web.xml до размера самого большого ответа HTML.

См. также: