programing

자바.java.java잘못된 상태 예외: CDATA 태그가 중첩되지 않을 수 있습니다.

lastmoon 2023. 7. 31. 21:47
반응형

자바.java.java잘못된 상태 예외: CDATA 태그가 중첩되지 않을 수 있습니다.

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 엔티티 속성을 하드 코딩하면 모든 것이 정상이기 때문입니다.때(Postgre ▁the▁however(Postgre))SQL)에서 앞서 언급한 예외를 발생시킵니다.

JSF 코드:

<p:column>
    <f:facet name="header">
        Action
    </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 응답을 렌더링하는 동안 예외가 발생했습니다.그러나 Mojara는 내장된 Ajax 예외 처리기를 사용하여 이 예외를 제대로 처리하지 못했으며, 이로 인해 원래 예외에 대한 모든 세부 사항을 숨기고 있는 또 다른 예외가 발생했습니다.

스택 추적을 자세히 살펴봅니다.맨 아래부터 시작하여 통화 스택을 추적합니다.

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

따라서 렌더 응답 단계에서 발생했습니다.다음 줄(위에 있는 줄)을 보십시오.

at com.sun.faces.context.AjaxExceptionHandlerImpl.handle(AjaxExceptionHandlerImpl.java:123)

예외 처리기를 전달되었습니다.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 응답을 작성하는 동안 예외가 발생했음을 나타냅니다. 대부분 HTML 출력을 생성하는 동안만 호출되는 getter 메서드에서 비즈니스 로직을 수행하기 때문입니다.따라서 프로세스는 다음과 같습니다.

  1. JSF가 RENDER_RESPON 단계로 들어갑니다.
  2. JSF는 HTML 출력을 생성해야 합니다.
  3. 에대여에 <f:ajax render="some">(또는)<p:ajax update="some">), , 를<update id="some">생성된 HTML 출력이 CDATA 블록 내에 있는 XML 블록입니다(XML 출력을 구문적으로 유효하게 유지).따라서 CDATA 블록을 시작해야 합니다.
  4. 블록으로 하는 동안 HTML "CDATA"를 렌더 EL 합니다.value모든 UI 구성 요소의 속성입니다.
  5. EL 표현식 뒤에 있는 게터가 버그로 인해 발생한 예외를 자신의 코드에 던졌습니다.
  6. JSF는 즉시 HTML 출력 생성을 중지하고 CDATA 블록을 닫지 않았습니다.HTTP 응답에는 반쯤 구워진 데이터가 포함되어 있습니다.
  7. AjaxExceptionHandlerImpl트리거됩니다.
  8. AjaxExceptionHandlerImpl예외/오류 세부 정보를 응답에 기록해야 합니다.하지만 이미 답변이 작성되었는지는 확인하지 않았습니다.맹목적으로 CDATA 블록을 열려고 시도하지만 이미 열려 있기 때문에 실패합니다.그것은 여러분이 보고 있는 예외를 버리고, 처리하려고 했던 실제 기본 예외에 대한 모든 세부 사항을 숨겼습니다.

보시다시피 문제는 두 가지입니다.

  1. JSF 렌더러는 응답을 반숙 상태로 두어서는 안 됩니다.
  2. 모자라의AjaxExceptionHandlerImpl응답 상태를 확인/수정했어야 합니다.

만약 당신이 Mojara의 내장된 Ajax 예외 핸들러를 스택 추적을 즉시 인쇄하는 사용자 정의 핸들러나 덜 구워진 Ajax 응답을 감지하고 정리할 수 있는 OmniFaces로 바꾼다면, 그것은 마침내 당신의 코드의 버그로 인한 진짜 기본을 드러내고 보여줄 것입니다.앞서 말씀드린 것처럼 비즈니스 로직을 더 좋은 방법으로 수행함으로써 발생할 가능성이 가장 높으며, 는 나쁜 관행입니다.

저도 당신과 같은 문제가 있었습니다. 백킹 빈에서 자동 완성 부품으로 바인딩을 사용했을 때 잘 작동했습니다.

<p:autoComplete id="autocomplete" binding="#{searchBean.compui}" title="Find" value="#{searchBean.searchfor}" forceSelection="false" queryDelay="30" dropdown="true" maxResults="20" emptyMessage="None" completeMethod="#{searchBean.complete}" style="width: 90%;"/>
<p:commandButton id="cmdsearch" value="#{msg.search}" action="#{searchBean.search}" update="tblprocresults" icon="ui-icon-zoomin"/>

그리고 뒤에 있는 콩 속에.

private AutoComplete compui;
//compui is initialized when bean is constructed
    public AutoComplete getCompui() {
            return compui;
        }

        public void setCompui(AutoComplete compui) {
            this.compui = compui;
        }

CDATA 문제는 PrimeFaces 질문이 아니라 부분 출력을 제공하는 책임이 있는 JSF 구현과 관련이 있습니다.JSF 속성으로 대체합니다;)

만약 당신이 또한 본다면.java.lang.ClassCastException: com.sun.faces.facelets.compiler.UIInstructions cannot be cast to org.primefaces.component.tree.UITreeNode서버 로그에서 추가

<context-param>
  <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
  <param-value>true</param-value>
</context-param>

로./WEB-INF/web.xml

고려해야 할 것을 집어넣는 것만으로도, 때때로 그것은 정말로 골머리를 썩이는 오류가 될 수 있습니다.

예를 들어 xhtml 페이지에서 사용하는 빈 중 하나에서 ArrayList를 초기화하는 것을 잊어버린 경우 다음과 같은 오류 메시지가 나타날 수 있습니다.

다음과 같은 작업을 수행할 수 있습니다.

List<String> myList;

하지만 이 작업을 수행하는 것을 잊으십시오.

myList = new ArrayList();

따라서 고려해야 할 또 다른 사항으로, 집안일을 모두 처리했는지 확인하십시오(변수가 초기화/입력되었는지 확인하는 등).

Tomcat 7에서 유사한 실행을 제거한 제 경험은: 만약 당신이 jsf에서 메소드를 호출하고 있다면, 매개 변수가 없더라도 ()를 추가해야 할 것입니다.

이 예외는 표시되지 않습니다(제티를 사용하는 경우).

편집: 이 예외는 제거되었지만 다른 예외는 다음과 같습니다.

java.lang.NoSuchMethodError: javax.el.ELResolver.invoke(Ljavax/el/ELContext;Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Class;[Ljava/lang/Object;)Ljava/lang/Object;

조사한 결과 Tomcat 7은 EL 의존성을 자체적으로 가져오므로 pom.xml의 다른 의존성은 다음과 같습니다.

<dependency>
    <groupId>javax.el</groupId>
    <artifactId>el-api</artifactId>
    <version>2.2</version>
    <scope>provided</scope>
</dependency>

혼합을 방지하기 위해 제거해야 합니다.

그 후에 다음과 같이 실행하여 Tomcat7을 시작해야 합니다.tomcat7:run대신이스서 tomcat:run기본적으로 Tomcat 6이 시작됩니다.

내 환경:

  • 이클립스 케플러
  • JDK 1.7.0_45
  • 메이븐 3.1.1

언급URL : https://stackoverflow.com/questions/11901882/java-lang-illegalstateexception-cdata-tags-may-not-nest

반응형