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
FullAjaxExceptionHandler不会重定向到Ajax请求的错误页面_Ajax_Jsf 2_Primefaces_Error Handling_Omnifaces - Fatal编程技术网

FullAjaxExceptionHandler不会重定向到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="

我知道这里有很多关于这个问题的问题,但几乎所有的问题都建议添加以下代码,因为FullAjaxExceptionHandler“之上”还有另一层,它发送普通重定向而不是Ajax重定向(请参阅):

相反,引发异常的Ajax请求在其响应主体中有以下内容:

<?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>