繁体   English   中英

Ajax 从 JSF PhaseListener 内部重定向失败

[英]Ajax redirection from inside a JSF PhaseListener fails

我的用例如下:已经向用户显示了一个 JSF2 页面。 该页面包含一个启用 Ajax 的按钮:

<p:commandButton value="#{msgs.reset}" process="@this"
   actionListener="#{reworkSearchMB.clearReworkSearch()}" tabindex="13"
   update="mainpanel messages" global="false"
   disabled="#{!userMB.hasAccessToViewRework() and !userMB.hasAccessToCreateOrUpdateRework()}"
/>

因此,当页面在屏幕上时,用户等待很长时间,session 过期。 之后,用户按下启用 Ajax 的按钮。

我想要发生的是:将用户重定向到登录屏幕。

因此,按照 Jim Driscoll 从http://weblogs.java.net/blog/2009/05/14/redirecting-jsf-20-ajax-request的建议,我创建了一个 PhaseListener 附加到 RESTORE_VIEW 阶段,它检查 Z21D6F40CFB511982E4524E0E250Z 是否有过期,如果是,则重定向到登录页面:

ExternalContext ectx = ctx.getExternalContext();
String newUrl =
ectx.encodeActionURL(ctx.getApplication().getViewHandler().getActionURL(ctx,
"/login.xhtml"));
try {
ectx.redirect(newUrl); // calls responseComplete() according to JavaDocs
} catch (IOException ex) {
throw new FacesException(ex);
}

在收听 beforePhase (RESTORE_VIEW) 时,我得到一个 NullPointerException:

SEVERE: java.lang.NullPointerException
at com.sun.faces.context.PartialViewContextImpl.createPartialResponseWriter(PartialViewContextImpl.java:434) ~[jsf-impl.jar:2.1.0-FCS]
at com.sun.faces.context.PartialViewContextImpl.access$300(PartialViewContextImpl.java:71) ~[jsf-impl.jar:2.1.0-FCS]
at com.sun.faces.context.PartialViewContextImpl$DelayedInitPartialResponseWriter.getWrapped(PartialViewContextImpl.java:575) ~[jsf-impl.jar:2.1.0-FCS]
at javax.faces.context.PartialResponseWriter.startDocument(PartialResponseWriter.java:115) ~[jsf-api.jar:2.1.0-FCS]
at org.primefaces.context.PrimePartialResponseWriter.startDocument(PrimePartialResponseWriter.java:103) ~[primefaces-2.2.1.jar:na]
at com.sun.faces.context.ExternalContextImpl.redirect(ExternalContextImpl.java:572) ~[jsf-impl.jar:2.1.0-FCS]
at com.argushealth.rework.phaselistener.SecurityPhaseListener.doRedirect(SecurityPhaseListener.java:80) ~[SecurityPhaseListener.class:na]
at com.argushealth.rework.phaselistener.SecurityPhaseListener.beforePhase(SecurityPhaseListener.java:42) ~[SecurityPhaseListener.class:na]
at com.sun.faces.lifecycle.Phase.handleBeforePhase(Phase.java:228) ~[jsf-impl.jar:2.1.0-FCS]
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:99) ~[jsf-impl.jar:2.1.0-FCS]
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:113) [jsf-impl.jar:2.1.0-FCS]
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) [jsf-impl.jar:2.1.0-FCS]
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409) [jsf-api.jar:2.1.0-FCS]
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534) [web-core.jar:3.1]
at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:787) [web-core.jar:3.1]
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:649) [web-core.jar:3.1]
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:483) [web-core.jar:3.1]
at org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:454) [web-core.jar:3.1]
at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:350) [web-core.jar:3.1]
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:300) [web-core.jar:3.1]
at com.argushealth.enterprise.security.web.spring.exception.AbstractExceptionHandler.handleException(AbstractExceptionHandler.java:44) [enterprise-security-web-spring-1.0.4.jar:na]
at com.argushealth.enterprise.security.web.spring.ui.ExceptionHandlingFilter.doFilterHttp(ExceptionHandlingFilter.java:57) [enterprise-security-web-spring-1.0.4.jar:na]
at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) [spring-security-core-2.0.3.jar:2.0.3]
at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371) [spring-security-core-2.0.3.jar:2.0.3]
at org.springframework.security.util.FilterChainProxy.doFilter(FilterChainProxy.java:174) [spring-security-core-2.0.3.jar:2.0.3]
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:236) [spring-2.5.5.jar:2.5.5]
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) [spring-2.5.5.jar:2.5.5]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) [web-core.jar:3.1]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) [web-core.jar:3.1]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) [web-core.jar:3.1]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) [web-core.jar:3.1]
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) [web-core.jar:3.1]
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) [web-core.jar:3.1]
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98) [web-glue.jar:3.1]
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91) [web-glue.jar:3.1]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162) [web-core.jar:3.1]
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326) [web-core.jar:3.1]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227) [web-core.jar:3.1]
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170) [kernel.jar:3.1]
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822) [grizzly-http.jar:1.9.31]
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719) [grizzly-http.jar:1.9.31]
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013) [grizzly-http.jar:1.9.31]
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225) [grizzly-http.jar:1.9.31]
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) [grizzly-framework.jar:1.9.31]
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) [grizzly-framework.jar:1.9.31]
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) [grizzly-framework.jar:1.9.31]
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) [grizzly-http.jar:1.9.31]
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) [grizzly-framework.jar:1.9.31]
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) [grizzly-framework.jar:1.9.31]
at com.sun.grizzly.ContextTask.run(ContextTask.java:71) [grizzly-framework.jar:1.9.31]
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) [grizzly-utils.jar:1.9.31]
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) [grizzly-utils.jar:1.9.31]
at java.lang.Thread.run(Thread.java:619) [na:1.6.0_20]

谢谢 Miguel Ping,这很有帮助。 我阅读了您提供的文章并尝试修复此错误。 但是当我编写下面的代码时遇到了另一个问题:

// workaround for PrimeFaces
  new RequestContextImpl(ec);
  if (ec.getRequestParameterMap().containsKey(Constants.PARTIAL_PROCESS_PARAM)
    && !ec.getRequestParameterMap().get(Constants.PARTIAL_PROCESS_PARAM).equals("@all")) {
    fc.setViewRoot(new PartialViewRoot(new UIViewRoot()));
  }

存在编译错误,因为我在 primefaces jar 文件中找不到 Class RequestContextImplPartialViewRoot 我使用 primefaces-2.2.1。 我发现这两个类存在于一些以前的版本中,但不存在于 2.2.x 中。 而且我把2.0.0版本的两个类复制到我自己的项目中,还是不行。 有任何想法吗?

NPE是 PrimeFaces 中的一个已知错误。 见这篇文章: http://primefaces.prime.com.tr/forum/viewtopic.php?f=3&t=2335

试试这个来设置视图

UIViewRoot view = facesContext.getApplication().getViewHandler().createView(facesContext, "");
facesContext.setViewRoot(view); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM