Статьи

Интеграция Spring и JSF: обработка исключений

Большинству разработчиков JSF знакома страница «Произошла ошибка», которая отображается, когда в их коде выдается непредвиденное исключение. Эта страница действительно полезна при разработке, но не является тем, что обычно требуется для производственного приложения. Обычно у вас есть несколько вариантов замены этой страницы на стандартную JSF; Вы можете использовать определение некоторых HTML-элементов <error-page> в вашем файле web.xml или написать собственный ExceptionHandler

Ни один из этих вариантов не идеален для разработчика 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 Филиппа Вебба в блоге Фила Вебба в блоге.