2010-11-26 3 views
5

Следуя моему предыдущему вопросу в Creating FacesMessage in action method outside JSF conversion/validation mechanism?, я пытаюсь обработать исключения, выброшенные из бизнес-уровня за пределами моих управляемых bean-компонентов.JSF 2: Это хороший подход для обработки бизнес-исключений?

Стратегия заключается в поиске и преобразовании бизнес-исключений в сообщения лиц в PhaseListener.

Он работает так, как я ожидал, но им просто интересно, если он просто изобретает колесо или делает это правильно с неправильным способом?

Вот мой пример кода фрагмент:

public class BusinessExceptionHandler implements PhaseListener { 

    @Override 
    public void afterPhase(PhaseEvent phaseEvent) { 
     ExceptionHandler exceptionHandler = phaseEvent.getFacesContext().getExceptionHandler(); 

     // just debugging the handled exception, nothing here 
     /* 
     for (ExceptionQueuedEvent event : exceptionHandler.getHandledExceptionQueuedEvents()) { 
      ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource(); 
      System.out.println("handled exception : " + context.getException()); 
     }*/ 

     for (Iterator<ExceptionQueuedEvent> it = exceptionHandler.getUnhandledExceptionQueuedEvents().iterator(); 
       it.hasNext();) { 

      ExceptionQueuedEvent event = it.next(); 
      ExceptionQueuedEventContext eventContext = (ExceptionQueuedEventContext) event.getSource(); 
      Throwable e = eventContext.getException(); 
      System.out.println("unhandled exception : " + e); 

      // get the root cause exception 
      while (e.getCause() != null) { 
       e = e.getCause(); 
      } 

      System.out.println("cause exception : " + e + 
       ", cause exception is BE : " + (e instanceof BusinessException)); 

      // handle BE 
      if (e instanceof BusinessException) { 
       BusinessException be = (BusinessException) e; 
       System.out.println("processing BE " + be); 
       FacesMessage message = Messages.getMessage(
        "com.corejsf.errors", 
        be.getMessage(), 
        be.getParamValues() 
       ); 
       FacesContext context = FacesContext.getCurrentInstance(); 
       context.addMessage(null, message); 
       it.remove(); // remove the exception 

       // works fine without this block, if BE is thrown, always return to the original page 
       /* 
       NavigationHandler navigationHandler = context.getApplication().getNavigationHandler(); 
       System.out.println("navigating to " + context.getViewRoot().getViewId()); 
       navigationHandler.handleNavigation(context, context.getViewRoot().getViewId(), null); 
       */ 
      } 
     } 
    } 

    @Override 
    public void beforePhase(PhaseEvent phaseEvent) { 
    } 

    @Override 
    public PhaseId getPhaseId() { 
     return PhaseId.INVOKE_APPLICATION; 
    } 

} 

Спасибо!

С уважением, Альберт Kam

ответ

2

Ваш подход - это смешение подходов JSF 1.x и JSF 2.x. Поскольку вы используете JSF 2.x, я бы предложил чистый подход JSF 2.x без PhaseListener и с помощью нового ExceptionHandler API.

Вы можете найти пример, который лечит ViewExpiredException в странице 282 книги «JSF 2.0: The Complete Reference», который доступен на сайте here (нажмите на ссылку 1-й результат).

+0

Привет снова. Спасибо за идею. Страница 282 недоступна. Но после некоторого поиска в Google я нашел статью Эдберна об этом вопросе и буду использовать эту практику позже: http://weblogs.java.net/blog/edburns/archive/2009/09/03/dealing-gracefully-viewexpiredexception- jsf2 – bertie 2010-11-29 12:29:21

3

Не уверен, почему вы собираетесь этот путь, создавая и регистрируя свой собственный обработчик исключений очень просто. Хотя проще будет Seam Catch (http://seamframework.org/Seam3/CatchModule и http://docs.jboss.org/seam/3/catch/3.0.0.Alpha1/reference/en-US/html_single/). Пока у меня нет моста JSF, но это будет очень легко сделать. Тогда все, что вам нужно сделать, это написать один метод, который будет обрабатывать конкретное исключение, и все будет готово!

+0

Я все еще новичок в jsf и полон сомнений относительно лучших практик, поэтому вопрос выше :) Спасибо за предложение, хотя я не использую фреймворк, я собираюсь взглянуть на обработчик исключений api. – bertie 2010-11-29 12:22:26

Смежные вопросы