Ни один из этих вариантов не идеален для разработчика Spring, элементы <error-page>, как правило, слишком просты, и в пользовательских ExceptionHandler сложно использовать концепции Spring, такие как внедрение зависимостей. К счастью, и JSF, и Spring являются очень расширяемыми средами, поэтому проект, над которым я работаю над интеграцией технологий, может предложить несколько убедительных альтернатив.
Первая доступная опция позволяет ExceptionHandler s быть зарегистрированным как Spring bean. Вместо использования существующего класса javax.faces.context.ExceptionHandler доступен новый интерфейс org.springframework.springfaces.exceptionhandler.ExceptionHandler . Интерфейс довольно прост, он определяет единственный метод дескриптора, который должен возвращать true, если исключение было обработано. Интерфейс использует универсальный для ограничения типов рассматриваемых исключений.
1
2
3
|
public interface ExceptionHandler<E extends Throwable> { boolean handle(E exception, ExceptionQueuedEvent event) throws Exception; } |
Все соответствующие bean-компоненты, которые реализуют интерфейс ExceptionHandler, будут рассмотрены, когда возникнет исключение из JSF. Первый обработчик, вернувший true, будет ‘win’, а последующие обработчики не будут вызваны. Вы можете использовать интерфейс org.springframework.core.Ordered или аннотацию @Ordered, если вам нужно отсортировать обработчики. Конечно, теперь, когда обработчики исключений являются обычными компонентами Spring, вы можете использовать все стандартные функции Spring, такие как внедрение зависимостей и AOP.
Теперь, когда у нас есть базовые обработчики исключений, мы можем предложить несколько полезных реализаций:
Иногда лучший способ обработать определенные исключения — просто показать сообщение и остаться на текущем экране. Например, предположим, что сервис генерирует исключение TooManyResultsException, когда поисковые запросы слишком широки. Простое сообщение, предлагающее пользователю «повторить попытку с более точными терминами», может быть единственной необходимой обработкой исключений. Класс org.springframework.springfaces.exceptionhandler.ObjectMessageExceptionHandler основан на предыдущей работе, которая отображает объекты в сообщения. Включите запись в ваш Spring MessageSource с полным именем Exception в качестве ключа, и FacesMessage будет показано, если возникнет исключение.
1
|
com.mycorp.search.TooManyResultsException=Too many results found, please try again with more precise search terms |
Вы можете легко сопоставить любое количество исключений с сообщениями, вы даже можете ссылаться на свойства исключения, используя заполнители ‘ {property} ‘ в вашей строке сообщения. Сообщения могут отображаться на экране с использованием стандартных методов JSF (обычно это компонент <h: messages /> ).
Поддержка быстрого отображения исключений в сообщениях хороша, но ее будет недостаточно для многих приложений, и написание бинов ExceptionHandler может быстро стать утомительным. Последний доступный вариант — org.springframework.springfaces.mvc.exceptionhandler.DispatcherExceptionHandler . DispatcherExceptionHandler обеспечивает мост между JSF и Spring MVC, который позволяет вам использовать аннотации @ExceptionHandler в ваших @Controller- ах, как если бы вы использовали любое другое приложение Spring MVC. Методы, аннотированные @ExceptionHandler , действительно универсальны и могут иметь очень гибкие подписи; Вы можете напрямую работать с исключениями или возвращать представление, которое должно быть отображено:
1
2
3
4
|
@ExceptionHandler public String handle(ExampleException e) { return 'redirect:errorpage' ; } |
Использование аннотаций @ExceptionHandler в Spring MVC очень удобно, и по этому вопросу было написано множество статей . Надеемся, что существующие разработчики JSF найдут стиль программирования Spring MVC привлекательной альтернативой стандартному JSF.
Пожалуйста, ознакомьтесь с другими статьями этой серии, и если вы хотите изучить код обработки исключений, лучше всего начать с пакетов ‘org.springframework.springfaces.exceptionhandler’ и ‘org.springframework.springfaces.mvc.exceptionhandler’. ,
Ссылка: Интеграция Spring & JavaServer Faces: Обработка исключений от нашего партнера JCG Филиппа Вебба в блоге Фила Вебба в блоге.