Primefaces3.2を使用しています。
私は次の状況にあります:
<h:form id="someForm">
..
<p:dataTable id="someDataTable" value="#{BackingBean.list}" var="element" ..>
<p:column>
<p:calendar id="someCalendar" value=#{element.date} ../>
<p:message id="someCalendarMessage" for=":someForm:someDataTable:someCalendar"/>
<p:column>
</p:dataTable>
..
</h:form>
「someDataTable」は動的に更新され、すべてのデータがサーバー側に送信されます。バッキングBeanで、入力した日付が条件を満たさない場合に、カレンダー「someCalendar」のメッセージを送信したいと思います。私はこのコードを使用してコンポーネントを見つけようとします:
FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.addMessage(facesContext.getViewRoot().findComponent(":someForm:someDataTable:" + "i" + ":someCalendar").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, Utils.getResourceBundleString("dictionary", "error") + ":", Utils.getResourceBundleString("dictionary", "some_message")));
return;
ここで、iはdataTableの「要素」のインデックスであり、BackingBeanにあるリストのインデックスと同じです。
問題は、ビューでカレンダーの生成されたIDを確認したにもかかわらず、facesContext.getViewRoot()。findComponent(..)メソッドがコンポーネントを見つけることができないため、NullPointerExceptionが発生することです。最初の要素であり、次の要素の場合は:someForm:someDataTable:1:someCalendarなどである必要があります。
なぜfacesContext.getViewRoot()。findComponent(..)メソッドが?内のコンポーネントを見つけることができないのですか?は動的に更新され、送信が完了した後、サーバー側が更新されたコンポーネントツリーを取得しない可能性がありますか?
前もって感謝します。