jsf IllegalStateException при перенаправлении даже с возвратом

В моем preRenderView вызываемом методе выполняются некоторые проверки, и если это не удается, произойдет перенаправление.

Но я получаю IllegalStateException

Information: Exception when handling error trying to reset the response.
java.lang.IllegalStateException
    at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:524)
    at com.sun.faces.context.ExternalContextImpl.redirect(ExternalContextImpl.java:602)
    at package.FacesContextUtils.redirect(FacesContextUtils.java:581)

Вот код:

public void initPreRenderView(final String value) throws DatabaseException
{
    if (value == null)
    {
        FacesContextUtils.addMessageInvalidLinkRedirect(context, url);
        return;
    }
}

В основном функция полезности состоит из:

public static void addMessageInvalidLinkRedirect(FacesContext context, String url)
{
    context.addMessage(null, new FacesMessage("Invalid link..."));
    try
    {
        context.getExternalContext().redirect(url);
    }
    catch (final IOException e)
    {
        // add error message
    }
}

Многие ответы на эту тему предполагают добавление возврата после оператора перенаправления, что я сделал в методе preRenderView.

Изменить:

Происходит перенаправление и все работает как положено. Просто хочу избавиться от этого сообщения об ошибке.


person djmj    schedule 10.07.2013    source источник
comment
Почему вы пытаетесь перенаправить перед рендерингом представления для начала?   -  person Luiggi Mendoza    schedule 10.07.2013
comment
Пользователь не должен посещать это представление без действительного параметра представления. Этот случай никогда не должен происходить, но если пользователь манипулирует URL-адресом вручную, это все равно может произойти.   -  person djmj    schedule 10.07.2013
comment
Вы можете использовать валидатор для вашего <f:viewParam>. См. stackoverflow.com/q/4888942/1065197.   -  person Luiggi Mendoza    schedule 10.07.2013
comment
Я знаю об этом, но даже если это не удастся, пользователь останется на той же странице. Но есть несколько параметров просмотра, где проверка зависит друг от друга. Мое требование необходимо. Существует еще больше вариантов использования для проверки контента в рамках сеанса, а на сайтах нет контента и вариантов использования, если такая проверка не удалась. В этом случае я должен перенаправить на наиболее действительную родительскую страницу.   -  person djmj    schedule 10.07.2013
comment
Тогда вы должны использовать фильтр вместо этого.   -  person Luiggi Mendoza    schedule 10.07.2013
comment
Насколько я знаю, фильтр возникает перед созданием bean-компонента с видимой областью или нет? Поэтому у меня нет доступа к моим необходимым свойствам и я не могу реализовать проверку.   -  person djmj    schedule 10.07.2013
comment
Но у вас также будет доступ к параметрам запроса. Это то, что вы хотите проверить, или нет?   -  person Luiggi Mendoza    schedule 10.07.2013
comment
В основном да, но параметры просмотра - это POJO с конвертерами. Перестраивать логику внутри фильтра — пустая трата времени. Перенаправление в preRenderEvent — это базовый шаблон для выполнения сложных проверок, поэтому давайте оставим его таким. Я просто хочу избавиться от исключения. stackoverflow.com/questions/10582441/   -  person djmj    schedule 11.07.2013


Ответы (2)


Проблема не в наличии или отсутствии оператора return. Проблема в том, что ответ нельзя сбросить. Давайте посмотрим, чем это вызвано:

java.lang.IllegalStateException
    at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:524)

На основе исходный код будет сгенерирован, когда isCommitted() вернет true. Таким образом, ответ уже зафиксирован. Часть ответа уже отправлена ​​клиенту.

В вашем вопросе нет ничего, что указывало бы на это. Таким образом, причину проблемы следует искать в чем-то другом, кроме предоставленной до сих пор информации. В стандартном JSF этого не должно происходить, поэтому, возможно, у вас есть фильтр сервлета, который устанавливает/фиксирует некоторые заголовки?

person BalusC    schedule 11.07.2013
comment
Что вы подразумеваете под установкой/фиксацией некоторых заголовков? Я использую ваш NoCacheFilter из этого ответа: stackoverflow.com/ вопросы/14101380/. В противном случае я использую некоторые фильтры аутентификации, чтобы проверить, вошел ли пользователь в систему, и перенаправить, если нет. Я проверю это. - person djmj; 12.07.2013
comment
Не было времени проверить еще раз, но эта ошибка возникает не всегда, иногда нет, потом возникает, но все равно перенаправляет (только в журнале), а в другое время ошибка отображается на сайте. Возможно ли, что моя система просто иногда тормозит? - person djmj; 01.08.2013

У меня возникла аналогичная проблема. Проблема оказалась в том, что другой запрос на перенаправление был сделан до того, как я вызвал тот, который ожидал. Поскольку один запрос на перенаправление уже был сделан, он выдал исключение IllegalStateException.

person Alan B. Dee    schedule 20.02.2014