The fact that I create it only if it doesn't yet exist with  "if 
(this.reportingPeriodsSelectItemsControl == null){}" doesn't count?
 

-----Original Message-----
From: Mike Kienenberger [mailto:[EMAIL PROTECTED] 
Sent: Friday, April 20, 2007 1:17 PM
To: MyFaces Discussion
Subject: Re: Dynamic Value binding - please help!

I think this is because you need to create the component in the
getter, not the setter.    If you create it in the setter, you'll get
a new instance of the components created each time you request the page again.

On 4/20/07, Leyzerzon, Simeon <[EMAIL PROTECTED]> wrote:
> Ok, another issue:
>
> <Apr 20, 2007 12:56:18 PM EDT> <Error> <HTTP> <BEA-101017> <[EMAIL PROTECTED] 
> - appName: 'GISWeb', name: 'GISWeb.war', context-path: '/GISWeb'] Root cause 
> of ServletException.
> java.lang.IllegalStateException: Client-id : repPeriods is duplicated in the 
> faces tree. Component : searchFrm:repPeriods, path: {Component-Path : [Class: 
> org.ajax4jsf.framework.ajax.AjaxViewRoot,ViewId: 
> /jsp/maintenance/search.jsp][Class: 
> javax.faces.component.html.HtmlPanelGrid,Id: _idJsp0][Class: 
> javax.faces.component.html.HtmlForm,Id: searchFrm][Class: 
> org.apache.myfaces.custom.fieldset.Fieldset,Id: _idJsp1][Class: 
> javax.faces.component.html.HtmlPanelGrid,Id: root][Class: 
> javax.faces.component.html.HtmlSelectOneMenu,Id: _idJsp6][Class: 
> org.apache.myfaces.custom.selectitems.UISelectItems,Id: repPeriods]}
>         at 
> org.apache.myfaces.application.jsp.JspStateManagerImpl.checkForDuplicateIds(JspStateManagerImpl.java:329)
>         at 
> org.apache.myfaces.application.jsp.JspStateManagerImpl.checkForDuplicateIds(JspStateManagerImpl.java:341)
>         at 
> org.apache.myfaces.application.jsp.JspStateManagerImpl.checkForDuplicateIds(JspStateManagerImpl.java:341)
>         at 
> org.apache.myfaces.application.jsp.JspStateManagerImpl.checkForDuplicateIds(JspStateManagerImpl.java:341)
>         at 
> org.apache.myfaces.application.jsp.JspStateManagerImpl.checkForDuplicateIds(JspStateManagerImpl.java:338)
>         Truncated. see log file for complete stacktrace
> >
>
>
>
> This happens when the form is resubmitted as a reaction on a change event in 
> the period selectOneMenu:
>
>       <h:outputText value="Period" />
>            <h:selectOneMenu value="#{searchHandler.period}" 
> onchange="document.forms['searchFrm'].submit();"
>                   valueChangeListener="#{searchHandler.periodChanged}" >
>                 <f:selectItems value="#{searchHandler.periods}"/>
>       </h:selectOneMenu>
>
>
>                 <h:outputText value="Reporting Period"  />
>                      <h:selectOneMenu 
> value="#{searchHandler.reportingPeriod.rawDate}"
>                                
> binding="#{searchHandler.reportingPeriodSelectOneMenuControl}">
>                      </h:selectOneMenu>
>
> The behavior I'm looking for is on the value change event in Period, the 
> combo with reportingPeriods should be redisplayed with different set of 
> values.
>
> This is the code in the periodChanged():
> ======================================================================
> ==================================================================
> public void periodChanged(ValueChangeEvent event) {
>
>
>     this.setContext(SwitchContextFactory.getContext(userProfile, 
> this.getPeriod()));
>     logger.debug("\t on which the period is: " + 
> this.getContext().getPeriod());
>
>     this.getSearchService().setContext(this.getContext());
>     this.getSearchService().getReportingPeriods();
>
>
>
>
>     if (this.reportingPeriodsSelectItemsControl == null){
>
>         this.reportingPeriodsSelectItemsControl = (UISelectItems) FacesContext
>                     .getCurrentInstance().getApplication().createComponent(
>                             UISelectItems.COMPONENT_TYPE);
>         this.reportingPeriodsSelectItemsControl.setId("repPeriods");
>     }
>
>
>
>     reportingPeriodsSelectItemsControl.setValue(reportingPeriods);
>     reportingPeriodsSelectItemsControl.setVar("rptPeriod");
>     if (DAILY.equals(this.getPeriod())) {
>         reportingPeriodsSelectItemsControl.setValueBinding("itemLabel",
>                     FacesContext.getCurrentInstance().getApplication()
>                             .createValueBinding(
>                                     "#{rptPeriod.reportingDateDaily}"));
>     }else if (MONTHLY.equals(this.getPeriod())) {
>         reportingPeriodsSelectItemsControl.setValueBinding("itemLabel",
>                     FacesContext.getCurrentInstance().getApplication()
>                             .createValueBinding(
>                                     "#{rptPeriod.reportingDateMonthly}"));
>     }
>
>     reportingPeriodsSelectItemsControl.setValueBinding("itemValue",
>             
> FacesContext.getCurrentInstance().getApplication().createValueBinding(
> "#{rptPeriod.rawDate}"));
>
>
>
>     
> this.reportingPeriodSelectOneMenuControl.getChildren().add(reportingPe
> riodsSelectItemsControl);
>
>
>
> }
> ======================================================================
> ==================================================================
>
>
> Here is the code in the setter fro <h:selectOneMenu> for reportingPeriod:
> ======================================================================
> ==================================================================
> public void setReportingPeriodSelectOneMenuControl(
>         HtmlSelectOneMenu _reportingPeriodSelectOneMenuControl) {
>
>
>     if (reportingPeriods == null){
>         logger.debug("reportingPeriods == null: " +
>                 (reportingPeriods==null) + " building reportingPeriods 
> list...");
>         reportingPeriods = this.getSearchService().getReportingPeriods();
>     }
>
>
>     //building <t:selectItems>
>     if (this.reportingPeriodsSelectItemsControl == null){
>         logger.debug("creating new <t:selectItems>");
>         this.reportingPeriodsSelectItemsControl = (UISelectItems) FacesContext
>                     .getCurrentInstance().getApplication().createComponent(
>                             UISelectItems.COMPONENT_TYPE);
>         this.reportingPeriodsSelectItemsControl.setId("repPeriods");
>     }
>
>
>     this.reportingPeriodsSelectItemsControl.setValue(reportingPeriods);
>     this.reportingPeriodsSelectItemsControl.setVar("rptPeriod");
>     if (DAILY.equals(this.getPeriod())) {
>         reportingPeriodsSelectItemsControl.setValueBinding("itemLabel",
>                     FacesContext.getCurrentInstance().getApplication()
>                             .createValueBinding(
>                                     "#{rptPeriod.reportingDateDaily}"));
>     }else if (MONTHLY.equals(this.getPeriod())) {
>         reportingPeriodsSelectItemsControl.setValueBinding("itemLabel",
>                     FacesContext.getCurrentInstance().getApplication()
>                             .createValueBinding(
>                                     "#{rptPeriod.reportingDateMonthly}"));
>     }
>
>     reportingPeriodsSelectItemsControl.setValueBinding("itemValue",
>             
> FacesContext.getCurrentInstance().getApplication().createValueBinding(
> "#{rptPeriod.rawDate}"));
>
>
>
>     
> _reportingPeriodSelectOneMenuControl.getChildren().add(reportingPeriod
> sSelectItemsControl);
>
>
>     this.reportingPeriodSelectOneMenuControl = 
> _reportingPeriodSelectOneMenuControl;
>     logger.debug("setReportingPeriodSelectOneMenuControl()" + 
> _reportingPeriodSelectOneMenuControl);
> }
> ======================================================================
> ==================================================================
>
>
>
> Appreciate if you could give me a direction in fixing this.
>
> Thank you in advance.
> Simeon
>
>
> -----Original Message-----
> From: Mike Kienenberger [mailto:[EMAIL PROTECTED]
> Sent: Friday, April 20, 2007 12:38 PM
> To: MyFaces Discussion
> Subject: Re: Dynamic Value binding - please help!
>
> I don't have any more ideas from what you've posted.   If it were me,
> I'd step through the process with the debugger and see why at this point.  
> Make sure the value bindings are set to what you think they are, and if they 
> are, see what's calling rawDate.
>
> On 4/20/07, Leyzerzon, Simeon <[EMAIL PROTECTED]> wrote:
> > Hah! That works, thanks, but now I'm facing a new complication: 
> > #{rptPeriod.reportingDateMonthly} and #{rptPeriod.reportingDateMonthly} 
> > doesn't seem to be mapping to the right field in the underlying bean.  Let 
> > me explain...
> >
> > 'rtpPeriod' is a representation of ReportingPeriod bean, instances of which 
> > populate the collection behind <t:selectItems> component.  These 
> > ReportingPeriod beans have 3 properties for display, each formatted 
> > differently, and set by Spring-based DAOlike this:
> >
> >
> > public void setReportingDate(Date reportingDate) {
> >         //logger.debug("set reporting date to: " + reportingDate);
> >
> >         this.reportingDate = reportingDate;
> >         this.setReportingDateDaily(new SimpleDateFormat("MMM dd 
> > yyyy").format(reportingDate));
> >         this.setReportingDateMonthly(new SimpleDateFormat("MMM 
> > yyyy").format(reportingDate));
> >         this.setRawDate(new 
> > SimpleDateFormat("MM/dd/yyyy").format(reportingDate));
> >     }
> >
> > What I see on the page though, is a combo box with the content populated in 
> > the following manner:
> >
> >                 03/01/2007
> >                 02/01/2007
> >                 01/01/2007, etc.
> >
> > That is instead of using #{rptPeriod.reportingDateMonthly} or 
> > #{rptPeriod.reportingDateDaily}, #{rtpPeriod.rawDate} seems to be used.
> >
> > Here is my current code:
> >
> > ====================================================================
> > == ===============================================================
> > public void setReportingPeriodSelectOneMenuControl(
> >         HtmlSelectOneMenu reportingPeriodSelectOneMenuControl) {
> >
> >
> >     if (reportingPeriods == null){
> >         logger.debug("reportingPeriods == null: " +
> >                 (reportingPeriods==null) + "building reportingPeriods 
> > list...");
> >         reportingPeriods = this.getSearchService().getReportingPeriods();
> >     }
> >
> >
> >     //building <t:selectItems>
> >     if (reportingPeriodsSelectItemsControl == null){
> >         reportingPeriodsSelectItemsControl = (UISelectItems) FacesContext
> >                     .getCurrentInstance().getApplication().createComponent(
> >                             UISelectItems.COMPONENT_TYPE);
> >
> >     }
> >
> >     reportingPeriodsSelectItemsControl.setValue(reportingPeriods);
> >     reportingPeriodsSelectItemsControl.setVar("rptPeriod");
> >     if (DAILY.equals(this.getPeriod())) {
> >         reportingPeriodsSelectItemsControl.setValueBinding("itemLabel",
> >                     FacesContext.getCurrentInstance().getApplication()
> >                             .createValueBinding(
> >                                     "#{rptPeriod.reportingDateDaily}"));
> >     }else if (MONTHLY.equals(this.getPeriod())) {
> >         reportingPeriodsSelectItemsControl.setValueBinding("itemLabel",
> >                     FacesContext.getCurrentInstance().getApplication()
> >                             .createValueBinding(
> >                                     "#{rptPeriod.reportingDateMonthly}"));
> >     }
> >
> >     reportingPeriodsSelectItemsControl.setValueBinding("itemValue",
> >
> > FacesContext.getCurrentInstance().getApplication().createValueBindin
> > g(
> > "#{rptPeriod.rawDate}"));
> >
> >
> >
> >
> > reportingPeriodSelectOneMenuControl.getChildren().add(reportingPerio
> > ds
> > SelectItemsControl);
> >
> >
> >     this.reportingPeriodSelectOneMenuControl = 
> > reportingPeriodSelectOneMenuControl;
> >     logger.debug("setReportingPeriodSelectOneMenuControl()" + 
> > reportingPeriodSelectOneMenuControl);
> > }
> >
> > }
> > ====================================================================
> > == ===============================================================
> >
> > ReportingPeriod bean is also registered as a managed-property of the 
> > backing bean on the faces-config.xml if it makes any difference.
> >
> > Thanks again!!!
> > Simeon
> >
> >
> > -----Original Message-----
> > From: Mike Kienenberger [mailto:[EMAIL PROTECTED]
> > Sent: Friday, April 20, 2007 10:26 AM
> > To: MyFaces Discussion
> > Subject: Re: Dynamic Value binding - please help!
> >
> > You need to assign ValueBinding objects, not strings.
> >
> > You'd typically do something like this [example borrowed and modified from 
> > another posting]:
> >
> >     FacesContext context = FacesContext.getCurrentInstance();
> >    Application app = context.getApplication();
> >
> >    reportingPeriodsSelectItemsControl.setValueBinding("itemLabel",
> > app.createValueBinding("#{rptPeriod.reportingDateMonthly}"));
> >
> >
> >
> > On 4/20/07, Leyzerzon, Simeon <[EMAIL PROTECTED]> wrote:
> > >
> > >
> > >
> > > Hi,
> > >
> > > I need to create the following construct dynamically in the backing bean:
> > >
> > > ==================================================================
> > > == == ======================== <h:outputText value="Reporting 
> > > Period"
> > > />
> > >      <h:selectOneMenu
> > > value="#{searchHandler.reportingPeriod.rawDate}"
> > >
> > > binding="#{searchHandler.reportingPeriodSelectOneMenuControl}">
> > >
> > >          <t:selectItems value="#{searchHandler.reportingPeriods}"
> > > var="rptPeriod"
> > >                 itemLabel="#{rptPeriod.reportingDateMonthly}"
> > > itemValue="#{rptPeriod.rawDate}"
> > >
> > > binding="#{searchHandler.reportingPeriodsSelectItemsControl}"
> > >          />
> > >      </h:selectOneMenu>
> > >
> > > ==================================================================
> > > ==
> > > ==
> > > ========================
> > >
> > > So I'm doing the following in my setter:
> > >
> > > ==================================================================
> > > == == ======================== public void 
> > > setReportingPeriodSelectOneMenuControl(
> > >         HtmlSelectOneMenu
> > > reportingPeriodSelectOneMenuControl) {
> > >
> > >
> > >     if (reportingPeriods == null){
> > >         logger.debug("reportingPeriods == null: " +
> > >                 (reportingPeriods==null) + "building 
> > > reportingPeriods list...");
> > >         reportingPeriods =
> > > this.getSearchService().getReportingPeriods();
> > >     }
> > >
> > >
> > >     //building <t:selectItems>
> > >     if (reportingPeriodsSelectItemsControl == null){
> > >         reportingPeriodsSelectItemsControl =
> > > (UISelectItems) FacesContext
> > >
> > > .getCurrentInstance().getApplication().createComponent(
> > >                             UISelectItems.COMPONENT_TYPE);
> > >
> > >     }
> > >
> > >
> > > reportingPeriodsSelectItemsControl.setValue(reportingPeriods);
> > >     reportingPeriodsSelectItemsControl.setVar("rptPeriod");
> > >
> > >     String label = null;
> > >
> > >
> > >
> > >     if (DAILY.equals(this.getPeriod())) {
> > >         label = "#{rptPeriod.reportingDateDaily}";
> > >     }else if (MONTHLY.equals(this.getPeriod())) {
> > >         label = "#{rptPeriod.reportingDateMonthly}";
> > >     }
> > >
> > >
> > >     reportingPeriodsSelectItemsControl.setItemLabel(label);
> > >
> > > reportingPeriodsSelectItemsControl.setItemValue("#{rptPeriod.rawDate}"
> > > );
> > >
> > >
> > >
> > > reportingPeriodSelectOneMenuControl.getChildren().add(reportingPer
> > > io
> > > ds
> > > SelectItemsControl);
> > >
> > >
> > >
> > >
> > >
> > >     this.reportingPeriodSelectOneMenuControl = 
> > > reportingPeriodSelectOneMenuControl;
> > >     logger.debug("setReportingPeriodSelectOneMenuControl()"
> > > + reportingPeriodSelectOneMenuControl);
> > > }
> > >
> > > ==================================================================
> > > ==
> > > ==
> > > ==========================
> > >
> > > Unfortunately, what I am getting in the page is the combo 
> > > populated with a bunch of strings: 
> > > #{rptPeriod.reportingDateMonthly}
> > >
> > > What am I missing here to link this variable 'rtpPeriod' to the 
> > > value binding expression.  Or should there be a different syntax?
> > >
> > > Thanks for you help.
> > > Simeon
> > >
> > > ==================================================================
> > > == == ======== Please access the attached hyperlink for an 
> > > important electronic communications disclaimer:
> > >
> > > http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html
> > > ==================================================================
> > > ==
> > > ==
> > > ========
> > >
> > >
> > >
> > >
> >
> > ====================================================================
> > == ======== Please access the attached hyperlink for an important 
> > electronic communications disclaimer:
> >
> > http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html
> > ====================================================================
> > ==
> > ========
> >
> >
>
> ======================================================================
> ======== Please access the attached hyperlink for an important 
> electronic communications disclaimer:
>
> http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html
> ======================================================================
> ========
>
>

==============================================================================
Please access the attached hyperlink for an important electronic communications 
disclaimer: 

http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html
==============================================================================

Reply via email to