JSF 2.1 + Spring + hibernate как правильно реализовать обработку исключений?



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



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



Несколько сервисов BLogicService - это весенние бобы, которые имеют Daoservice Autowired и выполняют некоторую операцию на POJOs и сохраняют его в спящем режиме. Помечено аннотациями @Service.



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



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



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



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

527   2  

2 ответов:

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

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

Он должен создать реализацию ExceptionHandler, которая в свою очередь реализует метод handle, например, один потребляющий исключения (я думаю, что я взял его из ссылки 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(Т) можно получить управляемый Bean-компонент, который будет печатать исключением из консоли GUI или вы можете просто использовать FacesContext.getCurrentInstance ().метод addmessage(). Вам также потребуется вызвать FacesContext.getCurrentInstance ().renderResponse () для обновления представления, так как необработанное исключение прервало жизненный цикл JSF.

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

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

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

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

Comments

    Ничего не найдено.