Как предварительно заполнить повторяющиеся h: selectOneMenu? - PullRequest
1 голос
/ 23 июня 2010

Изменение рабочей формы с одного места на заказ на несколько мест на заказ. У меня возникли проблемы с предварительным заполнением h: selectOneMenu. Исключение составляет 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 : null

старый рабочий код JSP:

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

новый не работающий код JSP:

<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>

Введено новое поле List<Spot> spots, а также метод получения и установки. List<SelectItem> getDeliveryTypes() был перемещен из класса управляемых бинов Order в класс Spot.

Как получить доступ к spot.deliveryTypes? Изменение # на $ не помогло, потому что значение = не принимает EL.

MyFaces 1.1.8

Спасибо.

1 Ответ

1 голос
/ 24 июня 2010

JSTL и JSF не идут рука об руку.JSP не будет обрабатываться сверху вниз, как вы ожидаете от кодирования.Более того, JSTL сначала обрабатывает JSP сверху вниз, а затем передает сгенерированный результат в JSF для собственной обработки сверху вниз.Это делает особенно непригодным c:forEach для такого рода требований.В данном конкретном случае ${spot} больше не будет, когда очередь JSF обрабатывать страницу JSP.

Вы хотите использовать компонент на основе JSF UIDataвместо c:forEach.Достойная альтернатива JSF c:forEach - это Томагавк t:dataList.Используйте его, и ваша проблема будет решена.

Если окажется, что вы используете Facelets вместо JSP, вы также можете использовать вместо него ui:repeat.

...