Показать ошибку на странице JSF и продолжить ее отображение вместо перенаправления на отдельную страницу ошибки

Всякий раз, когда возникает ошибка во время загрузки фаслета JSF, JSF останавливает отображение страницы в момент возникновения ошибки и вместо этого показывает страницу ошибки (поведение по умолчанию). Я хочу, чтобы JSF продолжал отображать страницу и отображал исключение/ошибку на странице. Например, если страница загружает «портлет», выдающий исключение, это исключение будет отображаться в портлете в виде текста. Я не хочу, чтобы вся страница перенаправлялась на отдельную страницу с ошибкой.

Я инициализировал свои собственные реализации ExceptionHandlerFactory и ExceptionHandler и могу успешно перебрать ExceptionQueueEvents. Однако я не знаю, как указать JSF продолжать загрузку страницы, несмотря на ошибку. Это вообще правильный подход? Вызывается ли ExceptionHandler после (как я полагаю) или в середине обработки лицевой панели? Если после, могу ли я что-нибудь сделать в моем ExceptionHandler?

Я знаю, что должен:

  • Скрыть части, к которым пользователь не может получить доступ (мой конкретный случай связан с безопасностью, когда пользователь пытается загрузить контент, на который у него нет прав. Однако я ищу глобальный ответ на это)
  • Вручную обрабатывайте ошибки, чтобы не возникали непредвиденные исключения.

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

Я использую Мохарру 2.0.2. Я чувствую, что это очень просто решить, но я не могу понять это :(


person Tuukka Mustonen    schedule 09.07.2010    source источник


Ответы (2)


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

Не делай этого.

person BalusC    schedule 09.07.2010
comment
Я согласен с тем, что следует избегать рендеринга неполного HTML, но бывают случаи, когда HTML все еще действителен. Например, если я делаю ‹div›#{myBean.someProperty}‹/div›, а свойство запрещено для текущего пользователя (выдает исключение), страница может просто отображать текст ошибки вместо свойства, такого как ‹div› AccessDeniedException‹/div› и HTML по-прежнему будут действительны. Возможно, я хотел бы инициализировать специальный bean/facelet, чтобы разумно сообщать о выброшенном исключении. Я согласен с тем, что во многих случаях страница сломается, но при осторожном использовании также может быть гарантирован правильный вывод? - person Tuukka Mustonen; 09.07.2010
comment
Там атрибут rendered для. - person BalusC; 09.07.2010
comment
Да, я постараюсь заранее избежать исключений и поймать их как можно лучше. Однако давайте рассмотрим, что у меня есть компонент JSF, вызывающий за ним управляемый компонент. В середине выполнения выбрасывается и не перехватывается очень неожиданное исключение. Есть ли способ вместо перенаправления пользователя на страницу с ошибкой показать некоторую общую ошибку вместо портлета (может быть, весь фаслет) и продолжить рендеринг остальной части страницы? Предположим, что портлет не связан с другими элементами страницы, вы все равно считаете это плохим? - person Tuukka Mustonen; 09.07.2010
comment
Это указывает на RuntimeException, так что да, скорее всего, это плохо. В качестве совершенно другой альтернативы вы можете рассмотреть JSTL c:catch. Но все же обработка исключений на стороне просмотра — плохая идея. Просто поймайте это на стороне бизнеса/модели и установите соответствующий токен/переключатель, где представление может перехватить использование атрибута rendered. - person BalusC; 09.07.2010
comment
Спасибо за ссылку на c:catch. Кажется, что у него могут быть некоторые проблемы, но он также может помочь, поэтому я выберу это как принятый ответ. Однако вместо использования c:catch я, вероятно, последую вашему совету и не буду игнорировать сбои в середине страницы, а вместо этого перенаправлю на отдельную страницу с ошибкой, чтобы сообщить пользователю о проблеме и позволить ему ввести некоторую дополнительную информацию в отчет о сбое. Я не думаю, что это обязательно лучший способ, но, безусловно, более безопасный. - person Tuukka Mustonen; 12.07.2010

Если на вашей странице есть отдельный контент, рассмотрите возможность использования (i)frames. Таким образом, если какое-то конкретное содержимое не загружается, вся страница все равно будет отображаться, но в этом фрейме будет отображаться страница с ошибкой. Это, конечно, означает, что все ваши отдельные компоненты являются полноценными html-страницами.

BalusC абсолютно прав в том, что вам НЕ следует пытаться обрабатывать какие-либо исключения синтаксического анализа и т. д. Странно отображаемые сегменты страницы не удобны для пользователя и могут привести к очень странным результатам.

Если у вас есть проблемы с ролями/правами, эти сценарии следует поддерживать отдельно от рендеринга jsf. Авторизацию следует подтверждать перед переадресацией на страницу, а не при попытке ее отображения.

person Java Drinker    schedule 09.07.2010
comment
Использование фреймов — хорошая идея, хотя, возможно, и не слишком удобная. Как я уже говорил в своем вопросе, я знаю, что должен: скрыть части, к которым пользователь не может получить доступ. Я постараюсь заранее скрыть запрещенные элементы и отловить исключения. Однако всегда есть утечки исключений, и я не хотел бы уничтожать всю страницу, если источником исключения является какой-то второстепенный компонент. После переосмысления проблемы я думаю, что достаточно иметь эту функцию замены содержимого элемента при сбое текстом ошибки в компонентах JSF. Поддерживать его везде не требуется. Любые дальнейшие мысли? - person Tuukka Mustonen; 09.07.2010