FullAjaxExceptionHandler不会重定向到Ajax请求的错误页面
我知道这里有很多关于这个问题的问题,但几乎所有的问题都建议添加以下代码,因为FullAjaxExceptionHandler“之上”还有另一层,它发送普通重定向而不是Ajax重定向(请参阅): 相反,引发异常的Ajax请求在其响应主体中有以下内容:FullAjaxExceptionHandler不会重定向到Ajax请求的错误页面,ajax,jsf-2,primefaces,error-handling,omnifaces,Ajax,Jsf 2,Primefaces,Error Handling,Omnifaces,我知道这里有很多关于这个问题的问题,但几乎所有的问题都建议添加以下代码,因为FullAjaxExceptionHandler“之上”还有另一层,它发送普通重定向而不是Ajax重定向(请参阅): 相反,引发异常的Ajax请求在其响应主体中有以下内容: <?xml version='1.0' encoding='UTF-8'?> <partial-response> <changes> <update id="
<?xml version='1.0' encoding='UTF-8'?>
<partial-response>
<changes>
<update id="javax.faces.ViewRoot"><![CDATA[<html xmlns="http://www.w3.org/1999/xhtml">... html of error page here ... </html>]]></update>
<update id="javax.faces.ViewState"><![CDATA[-3527653129719750158:5595502883804776498]]></update>
</changes>
</partial-response>
... 此处错误页面的html…]]>
看起来FullAjaxExceptionHandler没有做它应该做的事情,或者我遗漏了什么
更新
连接浏览器JS输出控制台屏幕盖
发现问题
我的错误页面的HTML格式不正确,它包含以下代码段,这导致浏览器中出现不匹配的标记错误:
<script type="text/javascript">
//<![CDATA[
scrollTo(0, 0);
//]]>
</script>
//
这似乎过早地关闭了CDATA标记。这个HTML是
标记的结果,我删除了它,因为我并不真正需要它。ajax响应看起来非常好,它有一个
包含整个错误页面文档,所以FullAjaxExceptionHandler
正确地完成了它的工作
在检索ajax响应之后,您的具体问题更可能是由客户端甚至错误页面文档本身引起的。接下来轮到JavaScript解析ajax响应并相应地替换当前HTML文档。检查浏览器的JavaScript控制台应该会给出该步骤中出现问题的任何线索。在您的特定情况下,问题似乎是由
呈现的内容周围嵌套的CDATA
块引起的,这反过来又导致了JavaScript解析错误
不幸的是,我手头的任何Mojarra版本都无法重现这个问题。也许您在某个地方有一个自定义/第三方脚本渲染器,负责添加
CDATA
块。当PartialViewContext\isAjaxRequest()
返回true
时,脚本呈现程序应跳过CDATA
块。如果您仍然无法理解它,那么您最好的选择是用一个简单的HTML替换
,或者甚至完全删除它-就像您最终做的那样。在最初的问题很多年后,现在使用的是Wildfly 15、JSF 2.3、OmniFaces 3.2,我偶然发现了一个类似的问题:在ajax调用期间发生异常时,FullAjaxExceptionHandler的部分响应格式不正确。原因是响应中嵌套了CDATA,因此注释掉了响应的一部分,导致XML解析错误。罪魁祸首似乎是JSF标记ui:debug。我已经删除了该声明,现在它按预期工作 哪个版本?旧版本的@all
:要排除至少PrimeFaces(及其捆绑的jQuery)成为原因,如果使用
而不是
,会怎么样?顺便说一句,Ajax响应看起来非常好。因此,在这一步之前,一切都很好。由于某种原因,JavaScript并没有将它应用到当前的HTML文档中,所以问题主要出在JS端。如果JS上下文有一些错误/冲突,也可能发生这种情况。你检查过JS控制台了吗?我用的是PF3.5。我在控制台中看到的唯一错误是未能解析部分更新。我将用控制台屏幕截图更新我的帖子。我从使用PF按钮改为,事实上,我被重定向到错误页面。我不确定这是否是我能解决的问题,是吗?好吧,这就是一个PF问题。在发布答案之前,我想知道您使用的是哪种浏览器,以及您是否有
或
。哦,这是固定的!“我的错误”页面的HTML格式不正确,因此错误的结束标记是有效错误。结束标记来自my errorPage.xhtml中的这一行:scrollTo(0,0);我不需要它,所以我删除了它,现在它可以工作了!请发布一个答案,谢谢你给我指出了正确的方向!你用Mojarra 2.1.24测试过吗?在任何情况下,看起来我可能仍然需要错误页面上的javascript,谢谢您的解决方案。
<?xml version='1.0' encoding='UTF-8'?>
<partial-response>
<changes>
<update id="javax.faces.ViewRoot"><![CDATA[<html xmlns="http://www.w3.org/1999/xhtml">... html of error page here ... </html>]]></update>
<update id="javax.faces.ViewState"><![CDATA[-3527653129719750158:5595502883804776498]]></update>
</changes>
</partial-response>
<script type="text/javascript">
//<![CDATA[
scrollTo(0, 0);
//]]>
</script>