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 :
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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>
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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) ...
Voici le code concernant la gestion du composant en question :
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 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }
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 :
Qu'en pensez-vous ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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>
Merci d'avance
Nico
Partager