2013-03-04 2 views
1

FullAjacExceptionHandler может только ловить javax.el.ELException или java.lang.Throwable. Throwable также имеет приоритет над javax.el.ELException. Мне нужно явно уловить конкретное исключение, созданное управляемым компонентом. Однако ELException, по-видимому, обертывает исключение основной причины (т. Е. LoginFailedException).FullAjaxExceptionhandler только ловит javax.el.ELException или java.lang.Throwable

Я использую JSF 2 (MyFaces 2.1.10), резонатор Spring EL (весенние управляемые бобы), el-api-2.2 и glassfish el-impl-2.2.

Вот ошибка:

Ajax request: No 
Status code: 500 
Exception type: class org.apache.myfaces.view.facelets.el.ContextAwareELException 
Exception message: javax.el.ELException: org.tests.omnifaces.exception.LoginFailedException: Login failed. 
Stack trace: org.apache.myfaces.view.facelets.el.ContextAwareELException: javax.el.ELException: org.tests.omnifaces.exception.LoginFailedException: Login failed. 
... 

LoginFailedException простое пользовательское исключение. Буду признателен за любую помощь. Заранее спасибо.

EDIT: эксперимент сделано:

Я создал 3 страницы ошибок, чтобы увидеть, какой из них будет называться/используется, когда LoginFailedException отбрасывается. Страницы ошибок XHTML содержат точно такой же код, кроме заголовка String, который идентифицирует, что есть. Вот записи об ошибках web.xml: будут использоваться

<error-page> 
    <exception-type>org.tests.omnifaces.exception.LoginFailedException</exception-type> 
    <location>/pages/errors/loginError.xhtml</location> 
</error-page> 

<error-page> 
    <exception-type>javax.el.ELException</exception-type> 
    <location>/pages/errors/elException.xhtml</location> 
</error-page> 

<error-page> 
    <exception-type>java.lang.Throwable</exception-type> 
    <location>/pages/errors/catchAllThrowable.xhtml</location> 
</error-page> 

catchAllThrowable.xhtml. Если я удалю (закомментируйте на web.xml) Throwable, будет использоваться ELException.xhtml. Если я удалю ELException, исключение будет обрабатываться контейнером (tomcat), а не loginError.xhtml.

Надеюсь, это уточнит мой случай.

UPDATE:

Я теперь с помощью AJAX вызова представить форму (я предполагаю, что это то, что обработчик предназначен для) со всеми страницами обработчиков 3 ошибок активных на web.xml (Throwable, ELException, LoginFailedException):

<h:commandButton id="loginButton" value="Login" action="#{login.loginUser}"> 
    <f:ajax execute="@form" render="@form messages" /> 
</h:commandButton> 

Throwable был пропущен, и ELException был подобран (elException.xhtml оказываемых). Все еще не удалось установить нулевое значение в LoginFailedException.

+0

Пожалуйста, напишите свое функциональное требование и что вы пытаетесь его решить, иначе никто не сможет вам помочь. –

+0

Спасибо @Luiggi .I отредактировал мое сообщение для уточнения. Надеюсь, поможет. На данный момент это всего лишь эксперимент/демонстрация. Мое единственное требование - отобразить пользовательское исключение, созданное управляемым компонентом, с помощью FullAjaxExceptionHandler и соответствующей страницы ошибки. –

+0

Фрагмент кода от OmniFaces предполагает, что он разворачивает исключение, чтобы перейти к первопричине и идентифицирует страницу с ошибкой. Я полагаю, что BalusC может наилучшим образом ответить на это :-) –

ответ

0

FullAjaxExceptionHandler только разворачивает коренные причины FacesException. Тем не менее, MyFaces ContextAwareELException не является подклассом FacesException, а является подклассом ELException и, следовательно, остается нераскрытым.

В соответствии с OmniFaces issue 149, FullAjaxExceptionHandler был улучшен, чтобы развернуть ELException. Это доступно с OmniFaces 1.4.