JSF 2.1 + Spring + hibernate, как правильно реализовать обработку исключений? - PullRequest
2 голосов
/ 19 июля 2011

Я работаю над проектом, который имеет следующую структуру:

DaoService - это bean-компонент Spring, который имеет объект SessionFactory и выполняет манипулирование базой данных в базе данных с использованием Hibernate. отмечены @Repository

несколько сервисов BLogicService - это бины Spring, которые имеют DaoService Autowired и выполняют некоторые операции над POJO и сохраняют их в Hibernate. Помечено @Service аннотациями.

Управляемые компоненты JSF 2.1 - выполнять итерацию по страницам XHTML и хранить свойства и действия JSF. Помечен как @ManagedBean и получает объекты BlLogicServices из Spring как @ManagedProperty

и, наконец, страницы XHTML, которые обращаются к управляемым bean-компонентам.

Каким будет правильный способ управления обработкой исключений в таком приложении? Если у меня есть исключение на уровне DAO, каков будет правильный способ перенаправить его в GUI?

Если бы я работал с Spring MVC, я бы использовал `@ExceptionHandler, но как это можно сделать в JSF 2.1 с Spring?

Ответы [ 2 ]

1 голос
/ 20 июля 2011

Чтобы создать общий обработчик исключений для всех непредвиденных исключений во время обработки BL, вы можете реализовать ExceptionHandlerFactory и указать его в face-config.xml:

  <factory>
    <exception-handler-factory>
      my.package.ExceptionHandlerFactory
    </exception-handler-factory>
  </factory>

Это должно создать реализацию ExceptionHandler, которая, в свою очередь, реализует дескрипторМетод, например, одно исключение потребления (я думаю, что я взял его из ссылки JSF2 или аналогичного источника):

  private static class MyExceptionHandler extends ExceptionHandlerWrapper {
    private ExceptionHandler parent;

    public WfExceptionHandler(ExceptionHandler parent) {
      this.parent = parent;
    }

    @Override
    public ExceptionHandler getWrapped() {
      return this.parent;
    }

    @Override
    public void handle() throws FacesException {
      for (Iterator<ExceptionQueuedEvent> i =
           getUnhandledExceptionQueuedEvents().iterator();
           i.hasNext();) {
        ExceptionQueuedEvent event = i.next();
        i.remove();
        ExceptionQueuedEventContext context =
          (ExceptionQueuedEventContext) event.getSource();
        Throwable t = context.getException();
        myProcessing(t);
      }
    }
    ...
  }

myProcessing (t) может получить управляемый бин, который выведет исключение на вашу консоль графического интерфейса, или вы можете простоиспользуйте FacesContext.getCurrentInstance (). addMessage ().Вам также потребуется вызвать FacesContext.getCurrentInstance (). RenderResponse (), чтобы обновить представление, поскольку необработанное исключение прервало жизненный цикл JSF.

В качестве альтернативы вы можете использовать try / catch во всех ваших методах управляемых компонентов и выполнить эквивалентmyProcessing (t) там.Разница в том, что ExceptionHandler также будет перехватывать исключения во время рендеринга страницы, которые не обязательно генерируются вашими классами.

0 голосов
/ 19 июля 2011

Исключения не следует передавать в пользовательский интерфейс.

Тот факт, что вы используете веб-уровень MVC, говорит о том, что у вас есть какие-то контроллеры для приема, проверки и связывания входящих запросов;выбрать обработчик для выполнения запроса;Упакуйте ответ, хороший или плохой;и выберите следующий вид.Исключению необходимо вернуться к этому контроллеру, который затем выдаст необходимую информацию и выберет вид ошибки.

Остальная часть вашего вопроса только запутывает проблему.DAO, MDB и т. Д. - все должно быть обработано каким-либо обработчиком.(JSF все еще вызывает эти Действия? Я никогда не использую его.) Этот обработчик должен перехватывать любые исключения и сообщать их обратно в пользовательский интерфейс через контроллер.

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