Omnifaces FullAjaxExceptionHandler + ‹страница ошибок› генерирует ContextNotActiveException

У меня проблемы с доступом к любому представлению (xhtml) моего приложения. javax.enterprise.context.ContextNotActiveException: если я устанавливаю тег страницы ошибок, при доступе к любому представлению возникает следующее исключение. Приложение работает нормально, но при доступе к любому представлению возникает это исключение. Если я удалю конфигурацию тега страницы ошибок, исключение не возникнет. Я использую Primefaces 4 + WAS 8.5.5.1 (MyFaces + OpenWebBeans). буду признателен за любую помощь

<!-- JSF Servlet -->
<servlet>
    <servlet-name>facesServlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>facesServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

<!-- Ominifaces -->
<filter>
    <filter-name>facesExceptionFilter</filter-name>
    <filter-class>org.omnifaces.filter.FacesExceptionFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>facesExceptionFilter</filter-name>
   <servlet-name>facesServlet</servlet-name>
</filter-mapping> 

<!-- error -->
<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/paginas/erro/sessaoExpirada.xhtml</location>
</error-page>
<error-page>
    <exception-type>java.lang.RuntimeException</exception-type>
    <location>/paginas/erro/erro500.xhtml</location>
</error-page>

Изменить: я заметил, что ошибка возникает только тогда, когда я устанавливаю код ошибки тега.

<error-page>
    <error-code>500</error-code>
    <location>/paginas/erro/erro500.xhtml</location>
</error-page>

Если я устанавливаю только тег типа исключения, проблема не возникает.

<error-page>
    <exception-type>java.lang.RuntimeException</exception-type>
    <location>/paginas/erro/erro500.xhtml</location>
</error-page>

Ниже приведена трассировка стека

00000082 ServletWrappe E com.ibm.ws.webcontainer.servlet.ServletWrapper service SRVE0014E: Uncaught service() exception root cause facesServlet: javax.servlet.ServletException: WebBeans context with scope type annotation @RequestScoped does not exist within current thread
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:221)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1230)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:779)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:136)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:79)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:960)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1064)
at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java:1385)
at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java:194)
at com.ibm.ws.webcontainer.webapp.WebApp.sendError(WebApp.java:3328)
at com.ibm.ws.webcontainer.webapp.WebApp.handleException(WebApp.java:3856)
at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3837)
at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:304)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:976)
at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:200)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:459)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:526)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:312)
at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:88)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1862)

Caused by: javax.enterprise.context.ContextNotActiveException: WebBeans context with scope type annotation @RequestScoped does not exist within current thread
at org.apache.webbeans.container.BeanManagerImpl.getContext(BeanManagerImpl.java:321)
at org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler.getContextualInstance(NormalScopedBeanInterceptorHandler.java:124)
at org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler.invoke(NormalScopedBeanInterceptorHandler.java:95)
at org.apache.webbeans.conversation.ConversationImpl_$$_javassist_4.isTransient(ConversationImpl_$$_javassist_4.java)
at org.apache.webbeans.jsf.WebBeansPhaseListener.beforePhase(WebBeansPhaseListener.java:93)
at org.apache.myfaces.lifecycle.PhaseListenerManager.informPhaseListenersBefore(PhaseListenerManager.java:76)
at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:160)
at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:119)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189)

* Изменить 2 * Если я удалю определение страницы с ошибкой 404, исключение не будет выдано.

<!-- error -->
<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/paginas/erro/sessaoExpirada.xhtml</location>
</error-page>
<error-page>
    <exception-type>java.lang.RuntimeException</exception-type>
    <location>/paginas/erro/erro500.xhtml</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/paginas/erro/erro500.xhtml</location>
</error-page>       
<error-page>
    <error-code>403</error-code>
    <location>/paginas/erro/erro403.xhtml</location>
</error-page>

    <!-- this definition throws the exception -->   
<error-page>
    <error-code>404</error-code>
    <location>/paginas/erro/erro404.xhtml</location>
</error-page>

person gfinotti    schedule 17.04.2014    source источник
comment
исходное сообщение отредактировано. Спасибо за ответ   -  person gfinotti    schedule 17.04.2014
comment
Похоже, ошибка находится на самой странице ошибки. Вы имеете в виду какие-либо бобы там? Чтобы исключить и то, и другое, попробуйте с пустыми страницами ошибок, просто напечатав какой-нибудь тестовый текст. По крайней мере, избавьтесь от всех выражений EL и добавляйте их обратно одно за другим, пока ошибка не повторится (в этот момент вы определили причину).   -  person BalusC    schedule 17.04.2014
comment
Balusc, я заметил, что ошибка возникает только тогда, когда я устанавливаю страницу ошибки для кода HTTP 404. Даже при использовании простого текста (ошибка 404) возникает ошибка. Для страниц ошибок 500 и 403 проблема не возникает. Существует ли правильный порядок для этого определения страниц ошибок? Я отредактировал исходный пост и поместил все свои настройки для страниц ошибок. Спасибо за вашу помощь PS: извините за мой плохой английский   -  person gfinotti    schedule 17.04.2014


Ответы (2)


У нас была та же проблема, и теперь это известная ошибка в WAS v8.5.5.x.

Мы открыли PMR от IBM и только что получили от них исправление: это APAR PI26908.

Я не знаю, будет ли он включен в WAS v8.5.5.4 или нет (сейчас мы используем WAS v8.5.5.3)

Также с этим исправлением нам нужно установить com.ibm.ws.webcontainer.deferServletRequestListenerDestroyOnError=true в веб-контейнере.

Вы должны связаться с этим, чтобы получить этот iFix

person titou10    schedule 27.10.2014

Может быть, слишком поздно, но еще немного информации:

Кратко: следует добавить пользовательское свойство в server.xml, содержащее следующее:

<webContainer deferServletRequestListenerDestroyOnError="true" />

Описание свойства: «Если для этого настраиваемого свойства установлено значение true, веб-контейнер позволяет CDI правильно работать на настраиваемых страницах ошибок» (по умолчанию для свойства установлено значение false).

person krisy    schedule 01.07.2015