java.lang.IllegalStateException: Must be called before the start element is closed (attribute 'id')

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

java.lang.IllegalStateException: Must be called before the start element is closed (attribute 'id')

Ludovic Pénet
Dear all,

I randomly get the following exception in one of my apps :

16-Nov-2015 16:36:35.980 SEVERE [http-apr-8444-exec-10]
org.omnifaces.exceptionhandler.FullAjaxExceptionHandler.logException
FullAjaxExceptionHandler: An exception occurred during rendering JSF
ajax response. Error page '/error.xhtml' will be shown.
  java.lang.IllegalStateException: Must be called before the start
element is closed (attribute 'id')
         at
org.apache.myfaces.shared.renderkit.html.HtmlResponseWriterImpl.writeAttribute(HtmlResponseWriterImpl.java:816)
         at
javax.faces.context.ResponseWriterWrapper.writeAttribute(ResponseWriterWrapper.java:109)
         at
org.apache.myfaces.context.PartialResponseWriterImpl.writeAttribute(PartialResponseWriterImpl.java:407)
         at
javax.faces.context.ResponseWriterWrapper.writeAttribute(ResponseWriterWrapper.java:109)
         at
javax.faces.context.ResponseWriterWrapper.writeAttribute(ResponseWriterWrapper.java:109)
         at
org.apache.myfaces.context.servlet.PartialViewContextImpl.processPartialRendering(PartialViewContextImpl.java:473)
         at
org.apache.myfaces.context.servlet.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:415)
         at
org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:60)
         at
javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:85)
         at
javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:516)
         at
javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:541)
         at
org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1891)
         at
org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:313)
         at
javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:58)
         at
javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:58)
         at
javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:58)
         at
javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:58)
         at
javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:58)
         at
org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:116)
         at
org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:267)
         at
org.apache.deltaspike.jsf.impl.listener.request.DeltaSpikeLifecycleWrapper.render(DeltaSpikeLifecycleWrapper.java:111)
         at
javax.faces.lifecycle.LifecycleWrapper.render(LifecycleWrapper.java:31)
         at
org.apache.deltaspike.jsf.impl.listener.request.JsfClientWindowAwareLifecycleWrapper.render(JsfClientWindowAwareLifecycleWrapper.java:160)
         at
org.apache.deltaspike.jsf.impl.listener.request.DeltaSpikeLifecycleWrapper.render(DeltaSpikeLifecycleWrapper.java:111)
         at
javax.faces.lifecycle.LifecycleWrapper.render(LifecycleWrapper.java:31)
         at
org.apache.deltaspike.jsf.impl.listener.request.JsfClientWindowAwareLifecycleWrapper.render(JsfClientWindowAwareLifecycleWrapper.java:160)
         at javax.faces.webapp.FacesServlet.service(FacesServlet.java:200)
         at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
         at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
         at
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
         at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
         at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
         at
org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71)
         at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
         at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
         at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:720)
         at
org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:466)
         at
org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:391)
         at
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318)
         at
org.apache.catalina.authenticator.FormAuthenticator.forwardToLoginPage(FormAuthenticator.java:384)
         at
org.apache.catalina.authenticator.FormAuthenticator.authenticate(FormAuthenticator.java:229)
         at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:577)
         at
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
         at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
         at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
         at
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
         at
org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:291)
         at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
         at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
         at
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
         at
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673)
         at
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2503)
         at
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2492)
         at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
         at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
         at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
         at java.lang.Thread.run(Thread.java:745)

I am certainly missing something big, but I really do not understand
what is happening. Can anyone please indicate me directions do seek ?

Thanks in advance,

Ludovic

|
| AVANT D'IMPRIMER, PENSEZ A L'ENVIRONNEMENT.
|

Reply | Threaded
Open this post in threaded view
|

Re: java.lang.IllegalStateException: Must be called before the start element is closed (attribute 'id')

Howard W. Smith, Jr.
On Mon, Nov 16, 2015 at 2:59 PM, [hidden email] <[hidden email]> wrote:

>  java.lang.IllegalStateException: Must be called before the start element
> is closed (attribute 'id')
>         at
> org.apache.myfaces.shared.renderkit.html.HtmlResponseWriterImpl.writeAttribute(HtmlResponseWriterImpl.java:816)
>

Searched google and found the following:

http://myfaces.apache.org/shared11/myfaces-shared-core/xref/org/apache/myfaces/shared/renderkit/html/HtmlResponseWriterImpl.html#318

Maybe, you can start there. Seems as though you id="..." on one of your
components may need to be fixed.
Reply | Threaded
Open this post in threaded view
|

Re: java.lang.IllegalStateException: Must be called before the start element is closed (attribute 'id')

Ludovic Pénet
On 17/11/2015 01:21, Howard W. Smith, Jr. wrote:

> On Mon, Nov 16, 2015 at 2:59 PM, [hidden email] <[hidden email]> wrote:
>
>>   java.lang.IllegalStateException: Must be called before the start element
>> is closed (attribute 'id')
>>          at
>> org.apache.myfaces.shared.renderkit.html.HtmlResponseWriterImpl.writeAttribute(HtmlResponseWriterImpl.java:816)
>>
> Searched google and found the following:
>
> http://myfaces.apache.org/shared11/myfaces-shared-core/xref/org/apache/myfaces/shared/renderkit/html/HtmlResponseWriterImpl.html#318
>
> Maybe, you can start there. Seems as though you id="..." on one of your
> components may need to be fixed.
Thanks for the suggestion, but it is alas not that simple.

As far as I understand...
In response to an AJAX request,
PartialViewContextImpl#processPartialRendering is called.

Lines 468 and following is :

             String currentEncoding = writer.getCharacterEncoding();
             writer.writePreamble("<?xml version=\"1.0\" encoding=\""+
                 (currentEncoding == null ? "UTF-8" : currentEncoding)
+"\"?>");
             writer.startDocument();

             writer.writeAttribute("id",
viewRoot.getContainerClientId(_facesContext),"id");

The exception is triggered when the attribute is set. An element is
opened (and, as far as I understand, not closed) by writer.startDocument();

If ones goes up in the stack, and take a look at
org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1891)
https://myfaces.apache.org/core22/myfaces-impl/xref/org/apache/myfaces/view/facelets/FaceletViewDeclarationLanguage.html#1891 
, one can read
lots of comments which makes me think that things are not simple and
that there might be side effects in some complex cases.


I see that I forgot to indicate the versions I am using...

PrimeFaces 5.3.1
MyFaces 2.2.8
OpenWebBeans 1.6.2

All this running on Tomcat 8.0.22 (in dev) or 8.0.28 (in prod).

Ludovic

|
| AVANT D'IMPRIMER, PENSEZ A L'ENVIRONNEMENT.
|

Reply | Threaded
Open this post in threaded view
|

Re: java.lang.IllegalStateException: Must be called before the start element is closed (attribute 'id')

Ludovic Pénet
On 17/11/2015 13:11, [hidden email] wrote:

> On 17/11/2015 01:21, Howard W. Smith, Jr. wrote:
>> On Mon, Nov 16, 2015 at 2:59 PM, [hidden email] <[hidden email]>
>> wrote:
>>
>>>   java.lang.IllegalStateException: Must be called before the start
>>> element
>>> is closed (attribute 'id')
>>>          at
>>> org.apache.myfaces.shared.renderkit.html.HtmlResponseWriterImpl.writeAttribute(HtmlResponseWriterImpl.java:816)
>>>
>>>
>> Searched google and found the following:
>>
>> http://myfaces.apache.org/shared11/myfaces-shared-core/xref/org/apache/myfaces/shared/renderkit/html/HtmlResponseWriterImpl.html#318 
>>
>>
>> Maybe, you can start there. Seems as though you id="..." on one of your
>> components may need to be fixed.
> Thanks for the suggestion, but it is alas not that simple.

I think I found what causes the bug...

I mentioned that I use :

     PrimeFaces 5.3.1
     MyFaces 2.2.8
     OpenWebBeans 1.6.2


I forgot to mention that I also use :

     omnifaces 1.10


I also noticed that the bug happens when :
* an ajax request is triggered
* the session is expired (for some reason I have yet to found, but it is
another problem)

The access to the ajax requested page is controlled by the container
with a <security-constraint> declaration in the webapp web.xml file.

In that case

OmniPartialViewContext.java#startDocument performs a redirect
https://github.com/omnifaces/omnifaces/blob/master/src/main/java/org/omnifaces/context/OmniPartialViewContext.java#L275

and so, an opened document with an active element is *not* the current sate.

When returning from this function, up to
org.apache.myfaces.context.servlet.PartialViewContextImpl.processPartialRendering#471

there is just after, line 473 :

writer.writeAttribute("id",
viewRoot.getContainerClientId(_facesContext),"id");

IMHO, MyFaces is right to expect to have an opened document at this
point... So I will see with BalusC if we can imagine a patch to omnifaces.
The newer 1.1x version, the 1.11, is not different on this point.

Thanks,

Ludovic

|
| AVANT D'IMPRIMER, PENSEZ A L'ENVIRONNEMENT.
|

Reply | Threaded
Open this post in threaded view
|

Re: java.lang.IllegalStateException: Must be called before the start element is closed (attribute 'id')

Ludovic Pénet
On 18/11/2015 17:53, [hidden email] wrote:

> On 17/11/2015 13:11, [hidden email] wrote:
>> On 17/11/2015 01:21, Howard W. Smith, Jr. wrote:
>>> On Mon, Nov 16, 2015 at 2:59 PM, [hidden email] <[hidden email]>
>>> wrote:
>>>
>>>>   java.lang.IllegalStateException: Must be called before the start
>>>> element
>>>> is closed (attribute 'id')
>>>>          at
>>>> org.apache.myfaces.shared.renderkit.html.HtmlResponseWriterImpl.writeAttribute(HtmlResponseWriterImpl.java:816)
>>>>
>>>>
>>> Searched google and found the following:
>>>
>>> http://myfaces.apache.org/shared11/myfaces-shared-core/xref/org/apache/myfaces/shared/renderkit/html/HtmlResponseWriterImpl.html#318 
>>>
>>>
>>> Maybe, you can start there. Seems as though you id="..." on one of your
>>> components may need to be fixed.
>> Thanks for the suggestion, but it is alas not that simple.
>
> I think I found what causes the bug...
>
> I mentioned that I use :
>
>     PrimeFaces 5.3.1
>     MyFaces 2.2.8
>     OpenWebBeans 1.6.2
>
>
> I forgot to mention that I also use :
>
>     omnifaces 1.10
>
>
> I also noticed that the bug happens when :
> * an ajax request is triggered
> * the session is expired (for some reason I have yet to found, but it
> is another problem)
>
> The access to the ajax requested page is controlled by the container
> with a <security-constraint> declaration in the webapp web.xml file.
>
> In that case
>
> OmniPartialViewContext.java#startDocument performs a redirect
> https://github.com/omnifaces/omnifaces/blob/master/src/main/java/org/omnifaces/context/OmniPartialViewContext.java#L275 
>
>
> and so, an opened document with an active element is *not* the current
> sate.
>
> When returning from this function, up to
> org.apache.myfaces.context.servlet.PartialViewContextImpl.processPartialRendering#471
>
>
> there is just after, line 473 :
>
> writer.writeAttribute("id",
> viewRoot.getContainerClientId(_facesContext),"id");
>
> IMHO, MyFaces is right to expect to have an opened document at this
> point... So I will see with BalusC if we can imagine a patch to
> omnifaces.
> The newer 1.1x version, the 1.11, is not different on this point.
For the record and people who might follow this thread...
I posted a question on this topic on stackoverflow :
http://stackoverflow.com/questions/33786117/bug-with-omnifaces-1-10-when-omnipartialviewcontextstartdocument-performs-trans

Regards,

Ludovic

|
| AVANT D'IMPRIMER, PENSEZ A L'ENVIRONNEMENT.
|

Reply | Threaded
Open this post in threaded view
|

Re: java.lang.IllegalStateException: Must be called before the start element is closed (attribute 'id')

Ludovic Pénet
On 19/11/2015 11:01, [hidden email] wrote:

> On 18/11/2015 17:53, [hidden email] wrote:
>> On 17/11/2015 13:11, [hidden email] wrote:
>>> On 17/11/2015 01:21, Howard W. Smith, Jr. wrote:
>>>> On Mon, Nov 16, 2015 at 2:59 PM, [hidden email]
>>>> <[hidden email]> wrote:
>>>>
>>>>>   java.lang.IllegalStateException: Must be called before the start
>>>>> element
>>>>> is closed (attribute 'id')
>>>>>          at
>>>>> org.apache.myfaces.shared.renderkit.html.HtmlResponseWriterImpl.writeAttribute(HtmlResponseWriterImpl.java:816)
>>>>>
>>>>>
>>>> Searched google and found the following:
>>>>
>>>> http://myfaces.apache.org/shared11/myfaces-shared-core/xref/org/apache/myfaces/shared/renderkit/html/HtmlResponseWriterImpl.html#318 
>>>>
>>>>
>>>> Maybe, you can start there. Seems as though you id="..." on one of
>>>> your
>>>> components may need to be fixed.
>>> Thanks for the suggestion, but it is alas not that simple.
>>
>> I think I found what causes the bug...
>>
>> I mentioned that I use :
>>
>>     PrimeFaces 5.3.1
>>     MyFaces 2.2.8
>>     OpenWebBeans 1.6.2
>>
>>
>> I forgot to mention that I also use :
>>
>>     omnifaces 1.10
>>
>>
>> I also noticed that the bug happens when :
>> * an ajax request is triggered
>> * the session is expired (for some reason I have yet to found, but it
>> is another problem)
>>
>> The access to the ajax requested page is controlled by the container
>> with a <security-constraint> declaration in the webapp web.xml file.
>>
>> In that case
>>
>> OmniPartialViewContext.java#startDocument performs a redirect
>> https://github.com/omnifaces/omnifaces/blob/master/src/main/java/org/omnifaces/context/OmniPartialViewContext.java#L275 
>>
>>
>> and so, an opened document with an active element is *not* the
>> current sate.
>>
>> When returning from this function, up to
>> org.apache.myfaces.context.servlet.PartialViewContextImpl.processPartialRendering#471
>>
>>
>> there is just after, line 473 :
>>
>> writer.writeAttribute("id",
>> viewRoot.getContainerClientId(_facesContext),"id");
>>
>> IMHO, MyFaces is right to expect to have an opened document at this
>> point... So I will see with BalusC if we can imagine a patch to
>> omnifaces.
>> The newer 1.1x version, the 1.11, is not different on this point.
> For the record and people who might follow this thread...
> I posted a question on this topic on stackoverflow :
> http://stackoverflow.com/questions/33786117/bug-with-omnifaces-1-10-when-omnipartialviewcontextstartdocument-performs-trans
This is fixed in omnifaces 2.2-SNAPSHOT and will be available in
omnifaces 1.12.

https://github.com/omnifaces/omnifaces/issues/183#issuecomment-158347582

Ludovic



|
| AVANT D'IMPRIMER, PENSEZ A L'ENVIRONNEMENT.
|