2010-06-23 8 views
1

Modification de la forme de travail avec un point par commande à plusieurs points par ordre J'ai rencontré des problèmes de pré-remplissage h: selectOneMenu. Exception est java.lang.IllegalArgumentException: Value binding '#{spot.deliveryTypes}'of UISelectItems with component-path {Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: /order.jsp][Class: javax.faces.component.html.HtmlForm,Id: pf][Class: javax.faces.component.html.HtmlSelectOneMenu,Id: _idJsp11][Class: javax.faces.component.UISelectItems,Id: _idJsp12]} does not reference an Object of type SelectItem, SelectItem[], Collection or Map but of type : nullComment préremplir la répétition h: selectOneMenu?

ancien code JSP de travail:

<h:selectOneMenu value="#{order.deliveryType}" immediate="true"> 
<f:selectItems value="#{order.deliveryTypes}" /> 
</h:selectOneMenu> 

nouveau code JSP qui ne travaillent pas:

<c:forEach var="spot" items="${order.spots}"> 
<h:selectOneMenu value="#{spot.deliveryType}" immediate="true"> 
    <f:selectItems value="#{spot.deliveryTypes}" /> <%-- Works as empty list if this line removed --%> 
</h:selectOneMenu> <c:out value="${spot.name}"/><br/> 
</c:forEach> 

Nouveau champ a été introduit List<Spot> spots ainsi que getter et setter. List<SelectItem> getDeliveryTypes() a été déplacé de la classe bean géré Order vers la classe Spot.

Comment accéder à spot.deliveryTypes? Changer # à $ n'a pas aidé car value = n'accepte pas EL.

MyFaces 1.1.8

Merci.

Répondre

1

JSTL et JSF ne vont pas bien ensemble. Le JSP ne sera pas traité de haut en bas comme vous l'attendez du codage. C'est d'autant plus important que JSTL traite d'abord le JSP de haut en bas puis transmet le résultat généré à JSF pour son propre traitement de haut en bas. Cela rend particulièrement le c:forEach inutilisable pour ce genre d'exigences. Dans ce cas particulier, le ${spot} ne sera plus là quand JSF traitera la page JSP.

Vous souhaitez utiliser un composant JSF UIData au lieu de c:forEach. Une alternative JSF complète à la c:forEach est Tomahawk's t:dataList. Utilisez-le et votre problème sera résolu.

S'il s'avère que vous utilisez Facelets au lieu de JSP, vous pouvez également utiliser ui:repeat à la place.