1

注文ごとに1つのスポットを持つ作業フォームを注文ごとに複数のスポットに変更する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()管理対象BeanクラスOrderからクラスSpotに移動されました。

spot.deliveryTypesにアクセスする方法は?value =はELを受け入れないため、#を$に変更しても効果はありませんでした。

MyFaces 1.1.8

ありがとう。

4

1 に答える 1

1

JSTLとJSFはうまく連携していません。コーディングから期待されるように、JSPは上から下に処理されません。さらに、JSTLは最初にJSPを上から下に処理し、次に生成された結果をJSFに渡して、上から下への独自の処理を行います。c:forEachこれにより、この種の要件には特に使用できなくなります。この特定のケースでは、${spot}JSFがJSPページを処理する番になると、はもう存在しません。

UIDataの代わりにJSFベースのコンポーネントを使用したいc:forEach。に代わる完全に価値のあるJSFc:forEachは、 Tomahawkのt:dataListものです。それを使用すると、問題が解決されます。

JSPの代わりにFaceletsを使用している場合は、代わりにFaceletsを使用することもできますui:repeat

于 2010-06-23T20:20:28.373 に答える