Probème avec le value binding
Bonjour,
Je suis nouveau en JSF et rencontre des difficultés avec le value binding et l'IOC.
Plus précisément, je tente actuellement d'imbriquer 2 datatables comme indiquées dans ce post [URL="http://forum.java.sun.com/thread.jspa?threadID=5119514&messageID=9938606"]
Voilà le fragment de la page web correspondant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <h:dataTable id="gElemsTable" value="#{SMABean.gElems}" var="gElem" rendered="false">
<h:column>
<s:fieldset id="gElemFieldset" legend="Generic Element">
<h:panelGroup>
<h:outputLabel for="gElemDescr">
<h:outputText value="description : "/>
<h:outputText id="gElemDescr" value="#{gElem.descr}"/>
</h:outputLabel>
</h:panelGroup>
<t:div>
<h:dataTable id="gElemPrtiesTable" value="#{gElem.prties}" var="ptry">
<h:column>
<h:outputLabel for="prtySpec">
<h:outputText value="#{ptry.id}" />
</h:outputLabel>
<h:form id="submitSpec">
<t:selectOneMenu id="prtySpec" value="#{ptry.selectedValue}">
<f:selectItems value="#{prty.domain}" />
</t:selectOneMenu>
<h:commandButton value="Select" action="#{SMABean.submitSpec}" />
</h:form>
</h:column>
</h:dataTable>
</t:div>
</s:fieldset>
</h:column>
</h:dataTable> |
Mon problème se situe au niveau des composants selectOneMenu de la table imbriquée. Quand j'essaye d'afficher la page je reçois l'erreur suivante :
Code:
1 2 3 4 5
| java.lang.IllegalArgumentException: Value binding '#{prty.domain}'of UISelectItems with component-path {Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: /pages/web_gui.jsp][Class: javax.faces.component.html.HtmlDataTable,Id: gElemPrtiesTable][Class: javax.faces.component.UIColumn,Id: _idJsp8][Class: org.apache.myfaces.component.html.ext.HtmlSelectOneMenu,Id: prtySpec][Class: javax.faces.component.UISelectItems,Id: _idJsp9]} does not reference an Object of type SelectItem, SelectItem[], Collection or Map but of type : null
at org.apache.myfaces.shared_tomahawk.util.SelectItemsIterator.hasNext(SelectItemsIterator.java:144)
at org.apache.myfaces.shared_tomahawk.renderkit.RendererUtils.internalGetSelectItemList(RendererUtils.java:450)
at org.apache.myfaces.shared_tomahawk.renderkit.RendererUtils.getSelectItemList(RendererUtils.java:428)
... |
J'ai un backing bean SMACfgtorBean pour gérer la vue qui englobe une liste d'objets GElem qui englobent eux mêmes les éléments SelectItems du composant selectOneMenu.
Voici le code concernant la gestion du composant en question :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| public class SMACfgtorBean {
...
private List<GElem> gElems;
...
public List<GElem> getgElems() { return gElems; }
...
}
public class GElem {
...
private List<VarProperty> prties;
...
public GElem(){
super();
prties = new ArrayList<VarProperty>();
}
...
public List<VarProperty> getPrties() { return prties; }
public void setPrties(List<VarProperty> somePrties) { this.prties = somePrties; }
...
}
public class VarProperty {
...
private List<SelectItem> domain;
private String selectedValue;
...
public VarProperty(){
super();
domain = new ArrayList<SelectItem>();
}
public String getSelectedValue() { return selectedValue; }
public void setSelectedValue(String selectedItem){ this.selectedValue = selectedItem; }
public List<SelectItem> getDomain() { return domain; }
public void setDomain(List<SelectItem> selectItems){ this.domain = selectItems; }
} |
Les objets GElem et VarProperty sont crées et initialisés par le backing bean SMACfgtorBean mais la notion de backing bean et d'objets imbriqués étant encore confus pour moi, l'erreur vient peut être d'ici ?
Ce qui est plutôt curieux est que dans les objets VarProperty j'ai d'autres propriétés non représentées dans le code tel qu'un id que j'arrive bien à afficher par le même mécanisme.
Voilà le mon fichier faces-config.xml correspondant :
Code:
1 2 3 4 5 6 7
| faces-config>
<managed-bean>
<managed-bean-name>SMABean</managed-bean-name>
<managed-bean-class>cfgtor_web_app.SMACfgtorBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config> |
Qu'en pensez-vous ?
Merci d'avance
Nico