JSF 2: Это хороший подход для обработки бизнес-исключений? - PullRequest
5 голосов
/ 26 ноября 2010

После моего предыдущего вопроса в Создание FacesMessage в методе действия вне механизма преобразования / проверки JSF? , я пытаюсь обработать исключения, генерируемые из бизнес-уровня вне моих управляемых bean-компонентов.

Стратегия заключается в поиске и преобразовании бизнес-исключений в сообщения лиц в 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;
    }

}

Спасибо!

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

Ответы [ 2 ]

3 голосов
/ 26 ноября 2010

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

2 голосов
/ 26 ноября 2010

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

Вы можете найти пример, который рассматривает ViewExpiredException на странице 282 книги "JSF 2.0: Полный справочник" , который доступен онлайн здесь (щелкните на 1-м результате ссылка).

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