Проблемы с редиректом после отлова исключения - PullRequest
2 голосов
/ 05 мая 2011

У меня проблема с перенаправлением в моем пользовательском ExceptionHandler.ExceptionHandler должен обрабатывать NullPointerExceptions и выполнять перенаправление в случае возникновения исключения.Вот часть обработчика, которая отвечает за перенаправление:

FacesContext fc = FacesContext.getCurrentInstance();
NavigationHandler nav = fc.getApplication().getNavigationHandler();
nav.handleNavigation(fc, null, "error" );

У меня есть простая страница для проверки ExceptionHandler:

<h:outputText value="#{requestTestBean.firstname}" />

И в методе получения для имениЯ навязываю исключение NullPointerException:

Object x = null;
x.toString();

Перенаправление на мою страницу ошибки работает хорошо для этого небольшого примера, но когда я добавляю значительно больше контента на страницу (например, меню с большим количеством записей и значков), перенаправление не 'не работает, потому что ответ уже передан в методе exceptionHandler.Я также пытался перенаправить на страницу ошибки с помощью response.sendRedirect (), но возникли те же проблемы.

Почему ответ уже зафиксирован?Есть ли какие-либо контекстные параметры или что-то еще, чтобы предотвратить это поведение?

Спасибо

1 Ответ

7 голосов
/ 05 мая 2011

Это одна из многих причин, почему бизнес-логика внутри геттеров является очень плохой идеей.

Но хорошо, давайте предположим, что это действительно экстремальное требование / сценарий использования, когда используется плохо разработанный код (вы знаете,Исключения времени выполнения, такие как NPE, на самом деле являются ошибками разработчика).Ответ будет принят, когда будет превышен определенный предел буфера тела ответа.Обычно это около 2 КБ, и реальное значение по умолчанию настраивается на уровне сервера приложений.Но вы также можете настроить его с помощью контекстного параметра с именем javax.faces.FACELETS_BUFFER_SIZE, который принимает размер буфера в байтах.Вот пример, который устанавливает его в 1 МБ.

<context-param>
    <param-name>javax.faces.FACELETS_BUFFER_SIZE</param-name>
    <param-value>1048576</param-value>
</context-param>

Он будет скрывать под ServletResponse#setBufferSize() каждый ответ.

Опять же, это на самом деле обходной путь к вашей конкретной проблеме и, следовательно, плохой подход.Настоящая проблема должна быть исправлена ​​в коде, позволяя получателям просто вернуть свойства компонента и ничего больше.Бизнес-логику необходимо выполнять в конструкторе, постконструкторе или любых методах событий (действий) компонента.Они выполняются задолго до фазы ответа рендеринга, и у вас есть все шансы обработать исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...