1

私は次のコードを持っています:

<h:outputText value="#{lecture.lectureName}" />

<c:forEach items="#{criterionController.getCriteriaForLecture(lecture)}" var="criterion">

     <h:outputText value="#{criterion.criterionName}"  />
     <h:commandLink value="Edit"/>
     <h:commandLink value="Delete"/>

</c:forEach>

出力テキスト部分は完全に機能しており、表示する内容が表示されるため、lectureオブジェクトが設定されていることが証明されます。ただし、foreachタグはnullポインタ例外を与えます。コードをデバッグしたところ、メソッドgetCriteriaForLecture()が呼び出されたときに講義オブジェクトがnullと見なされていたことがわかりました。

この動作はどのように説明できますか?

4

1 に答える 1

2

これは、前の質問に基づいて、変数が、、lecturerなどのJSF反復コンポーネントまたはおそらくはによって設定されている場合に発生する可能性があります。<h:dataTable><ui:repeat><p:tabView>

この動作のより詳細な説明はここにあります:JSF2フェイスレットのJSTL ...意味がありますか?つまり、JSTLタグは、ビューのレンダリング中ではなく、ビューの構築中に実行されます。特定のlecturerケースでは、変数はビューのレンダリング中にのみ使用可能であるためnull、JSTLの実行時に常にビューの構築中に使用できます。

<ui:repeat>これを解決するには、代わりにのような通常のJSFコンポーネントを使用します。

<ui:repeat value="#{criterionController.getCriteriaForLecture(lecture)}" var="criterion">
     <h:outputText value="#{criterion.criterionName}"  />
     <h:commandLink value="Edit"/>
     <h:commandLink value="Delete"/>
</ui:repeat>

ゲッターでビジネスアクションをまったく行わない方がはるかに良いでしょう。代わりにList<Criterion>のプロパティを作成してください。Lecture

<ui:repeat value="#{lecture.criterions}" var="criterion">
     <h:outputText value="#{criterion.criterionName}"  />
     <h:commandLink value="Edit"/>
     <h:commandLink value="Delete"/>
</ui:repeat>

JSFがゲッターを複数回呼び出す理由も参照してください

于 2012-06-21T15:40:06.583 に答える