gpt4 book ai didi

ajax - java.lang.IllegalStateException:CDATA标记可能不嵌套

转载 作者:行者123 更新时间:2023-12-03 12:31:02 24 4
gpt4 key购买 nike

我在JSF页面中遇到了Ajax请求的问题。当我单击按钮时,出现以下异常:

SEVERE: Servlet.service() for servlet Faces Servlet threw exception
java.lang.IllegalStateException: CDATA tags may not nest
at com.sun.faces.renderkit.html_basic.HtmlResponseWriter.startCDATA(HtmlResponseWriter.java:630)
at javax.faces.context.ResponseWriterWrapper.startCDATA(ResponseWriterWrapper.java:172)
at javax.faces.context.PartialResponseWriter.startError(PartialResponseWriter.java:342)
at org.primefaces.context.PrimePartialResponseWriter.startError(PrimePartialResponseWriter.java:210)
at com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError(AjaxExceptionHandlerImpl.java:200)
at com.sun.faces.context.AjaxExceptionHandlerImpl.handle(AjaxExceptionHandlerImpl.java:123)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)

我认为 String对象存在一些问题,因为当我对站点上显示的JPA实体属性进行硬编码时,一切正常。但是,当从数据库(PostgreSQL)中检索实体时,它将引发上述异常。

JSF代码:
<p:column>
<f:facet name="header">
Akcja
</f:facet>
<h:commandButton actionListener="#{mBDocumentMigration.actionEdit(object)}" value="Edytuj" rendered="#{mBDocumentMigration.editingObject == null}" >
<f:ajax render="@form" execute="@form" />
</h:commandButton>
<h:commandButton action="#{mBDocumentMigration.actionZapisz}" value="Zapisz" rendered="#{mBDocumentMigration.editingObject != null}" >
<f:ajax render="@form" execute="@this" />
</h:commandButton>
</p:column>

最佳答案

在渲染JSF响应期间,由于代码中的错误而引发了异常。但是,Mojarra却无法使用内置的ajax异常处理程序正确处理此异常,从而导致了另一个您现在看到的异常,隐藏了有关原始异常的所有详细信息。

仔细查看堆栈跟踪。从底部开始以跟踪调用堆栈:

at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)

因此,它发生在渲染响应阶段。好的,请看下一行(上面的那一行):
at com.sun.faces.context.AjaxExceptionHandlerImpl.handle(AjaxExceptionHandlerImpl.java:123)

嘿,它已经通过Mojarra的内置ajax异常处理程序 AjaxExceptionHandlerImpl传递了!当ajax请求期间发生异常时,仅调用这是 。好的,从下至上依次阅读以下几行:
at com.sun.faces.renderkit.html_basic.HtmlResponseWriter.startCDATA(HtmlResponseWriter.java:630)
at javax.faces.context.ResponseWriterWrapper.startCDATA(ResponseWriterWrapper.java:172)
at javax.faces.context.PartialResponseWriter.startError(PartialResponseWriter.java:342)
at org.primefaces.context.PrimePartialResponseWriter.startError(PrimePartialResponseWriter.java:210)
at com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError(AjaxExceptionHandlerImpl.java:200)

因此,它试图将错误信息写入ajax响应。此信息必须放在CDATA块中。但是,启动CDATA块失败如下,因为显然已经打开了CDATA块:
java.lang.IllegalStateException: CDATA tags may not nest

这又表明异常是在编写ajax响应期间发生的,最可能的原因是您正在使用getter方法执行业务逻辑,该方法仅在生成HTML输出时才被调用。因此,该过程很可能如下所示:
  • JSF进入RENDER_RESPONSE阶段。
  • JSF需要生成HTML输出。
  • 对于每个<f:ajax render="some">(或<p:ajax update="some">),它需要使用CDATA block内的生成的HTML输出创建一个<update id="some"> XML块(以保持XML输出在语法上有效)。因此,需要启动一个CDATA块。
  • 在将HTML输出生成到CDATA块时,将评估所有渲染时EL表达式,包括所有UI组件的value属性。
  • 在某个地方,EL表达式背后的 getter 抛出了一个由您自己的代码中的错误引起的异常。
  • JSF立即停止生成HTML输出,并且没有关闭CDATA块。 HTTP响应包含未完成的数据。
  • AjaxExceptionHandlerImpl被触发。
  • AjaxExceptionHandlerImpl需要将异常/错误详细信息写入响应。但是,它没有检查响应是否已经写入。它盲目地尝试打开一个CDATA块,该块又因已经打开而失败了。它引发了您所看到的异常,从而隐藏了它尝试处理的真正基础异常的所有详细信息。

  • 如您所见,问题有两个:
  • JSF渲染器不应该将响应置之不理。
  • Mojarra的AjaxExceptionHandlerImpl应该已经检查/验证了响应状态。

  • 如果您用custom one which immediately prints the stack traceOmniFaces FullAjaxExceptionHandler which is capable of detecting and cleaning halfbaked ajax responses替换Mojarra的内置ajax异常处理程序,那么它最终将揭示并显示由代码中的错误引起的实际底层。如前所述,它很可能是由performing business logic in a getter method, which is a bad practice引起的。

    关于ajax - java.lang.IllegalStateException:CDATA标记可能不嵌套,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11901882/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com