Sertic Mirko, Bedag wrote:
Hi there
I am having problems with the following exception :
Caused by:_ org.apache.jasper.JasperException_: Client-id : _id9 is
duplicated in the faces tree. Component : _idJsp3:_id9, path:
{Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId:
/createevn.jsp][Class: oracle.adf.view.faces.component.html.HtmlHtml,Id:
_idJsp0][Class: oracle.adf.view.faces.component.html.HtmlBody,Id:
_idJsp2][Class: javax.faces.component.html.HtmlForm,Id: _idJsp3][Class:
ch.bedag.common.web.component.cdbund.CDBundPageComponent,Id:
_idJsp4][Class:
ch.bedag.common.web.component.layout.GridbagLayoutComponent,Id:
_idJsp26][Class:
ch.bedag.common.web.component.layout.GridbagLayoutCellComponent,Id:
_idJsp58][Class:
ch.bedag.common.web.component.layout.TitledBoxComponent,Id:
_idJsp59][Class:
ch.bedag.common.web.component.layout.GridbagLayoutComponent,Id:
_idJsp60][Class:
ch.bedag.common.web.component.layout.GridbagLayoutCellComponent,Id:
_idJsp62][Class:
ch.bedag.common.web.component.input.InputfieldComponent,Id:
_idJsp63][Class: javax.faces.component.UICommand,Id: _id9]}
This happens when i navigate to the page, navigate to another page and
finally when i come back to the origin, the above
exception is generated. The question is now : why is there a duplicate
id? I thought that the whole component tree would
be rebuild when a new page is accessed. It is a custom component, but it
worked very well in prior projects. The only
Difference is here that is use a binding for the component to access it
from a backing bean. Am i missing something?
Is your binding stored in a bean that is session-scoped, ie still exists
when you come to re-render the page?
When using JSF1.1+JSP, the first render goes like this:
For each JSF tag in the page, if the tag has a binding attribute then:
* Read from the specified property.
* If that returns non-null then attach the returned component to the
view tree and at skip any further processing of that JSF tag.
If no binding exists, or binding returns null then create a new
component instance, set properties from tag. If no explicit id is
defined on the tag then create a dynamic one.
So yes binding can be related to this "duplicate id" problem. However it
normally doesn't cause any problem because the id computed the first
time it was created should be the same as on the next time. Do you
perhaps have a <c:if> or <c:forEach> tag in the page so that on
different renders there are different numbers of components actually
created for the page? That would definitely cause problems when combined
with bindings...
I would suggest firstly to avoid using c:if or c:forEach if you are
currently doing so. These tags interact very badly with JSF1.1.
Secondly, having session-scoped beans with bindings that are still valid
when a page is re-rendered after being somewhere else is not very nice.
This is very memory-inefficient for a start; because each component has
references to its parent and children this effectively holds the entire
component tree for that view in memory for the length of the http
session. You might want to look into using t:saveState + request-scoped
backing beans instead.
Regards,
Simon