Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 web.xml中定义的错误页面嵌入在部分呈现的JSF页面中_Jsf 2 - Fatal编程技术网

Jsf 2 web.xml中定义的错误页面嵌入在部分呈现的JSF页面中

Jsf 2 web.xml中定义的错误页面嵌入在部分呈现的JSF页面中,jsf-2,Jsf 2,我在web.xml中定义了以下内容: <error-page> <exception-type>java.lang.Throwable</exception-type> <location>/shared/errors/DefaultErrorPage.xhtml</location> </error-page> <error-page> <exception-type>jav

我在web.xml中定义了以下内容:

<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/shared/errors/DefaultErrorPage.xhtml</location>
</error-page>
<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/shared/errors/ViewExpired.xhtml</location>
</error-page>

java.lang.Throwable
/共享/errors/DefaultErrorPage.xhtml
javax.faces.application.ViewExpiredException
/共享/errors/ViewExpired.xhtml
我还在faces-config.xml中使用Omnifaces中的FullAjaxExceptionHandler:

<factory>
    <exception-handler-factory>
        org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory
    </exception-handler-factory>
</factory>

org.omnifaces.exceptionhandler.fullajaxexceptionhandler工厂
FullAjaxExceptionHandler在ajax调用中工作正常,但是当我直接点击一个页面时出现错误,它开始呈现我试图访问的页面,但没有完成,然后呈现web.xml中定义的错误页面,这导致错误页面嵌入在部分呈现的页面之后

(我正在使用Glassfish 3.1.1,其中包含Mojarra JSF 2.1.3)编辑:现在使用Glassfish 3.1.2.2和JSF 2.1.11

编辑:发现以下内容:
发生错误的页面正在使用模板(
),如果我将其更改为该页面不再使用模板,然后仅添加模板中的所有代码,则其工作正常。

在引发异常之前已提交响应时,将发生这种情况。当
ServletOutputStream#flush()
以某种方式被显式调用时,响应将被提交,这通常仅在响应缓冲区(在大多数容器中默认为2KB)溢出时发生。承诺的响应是一个无法返回的点。服务器无法从客户端取回已发送的字节。服务器基本上有两个选项:

  • 将响应保持原样,并仅将异常记录到服务器日志中
  • 无论如何,请尝试将错误页写入响应
您的Glassfish设置显然选择了第二种方式。没有一个是完美的。客户端最终仍然会得到一个不完整的HTML响应,最终用户对它的看法取决于webbrowser如何尽最大努力解释和呈现迄今为止获得的HTML

但是,作为JSF开发人员,您可以使用几种方法来避免这种情况的发生。首先,为什么在呈现响应时会抛出该异常?这难道不表明您自己的代码中存在bug吗?在呈现响应之前,您是否会更好地执行异常敏感的业务作业?您可以使用其他
来实现此目的

<f:event type="preRenderView" listener="#{bean.init}" />

如果由于某种原因这不是一个选项,您可以考虑将响应缓冲区的大小增加到最大HTML响应的大小以上,这样在异常发生之前,响应不会自动刷新。您可以通过以下上下文参数来实现这一点,该参数假定每个HTML响应都符合100KB的限制:

<context-param>
    <param-name>javax.faces.FACELETS_BUFFER_SIZE</param-name>
    <param-value>102400</param-value><!-- 100KB -->
</context-param>

javax.faces.FACELETS\u缓冲区\u大小
102400

这很奇怪。为了排除一个和另一个,JSF项目阶段是否设置为
Development
。我不知道你说的“排除一个和另一个”是什么意思。如果我使用FullAjaxExceptionHandlerFactory进行ajax调用,我是否还需要一个ExceptionHandlerFactory进行非ajax调用?不,我想到了一些可能的原因,我只是想问一下项目阶段,以便我可以从脑海中的列表中划出(排除)一些可能的原因。不,对于非ajax调用,不需要
异常处理程序。请参阅回到您的具体问题,尝试将Mojarra升级到最新版本,目前为2.1.11。我记得以前见过这个问题,但我不确定它是为什么和如何引起的。我相信这是旧版Mojarra中的一个bug。我刚刚升级到glassfish 3.2.2,我仍然看到这个问题。FacesContext.class.getPackage().getImplementationVersion()返回2.1.6-SNAPSHOT。我很惊讶他们没有更高版本的JSF,更奇怪的是它是一个快照版本。如果我包括最新的Mojarra JSF库,它会覆盖与glassfish捆绑的库吗?增加缓冲区大小有效,谢谢!此错误在ManagedBean中的后构造期间发生。页面上使用了很多托管bean,其中大多数都有自己的设置代码,方法中带有PostConstruct注释。为了使用preRenderView,我必须将所有的初始化代码放在一个函数中,或者您可以有多个preRenderView事件,但是您必须维护每个页面的事件。