2

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(..)メソッドが?内のコンポーネントを見つけることができないのですか?は動的に更新され、送信が完了した後、サーバー側が更新されたコンポーネントツリーを取得しない可能性がありますか?

前もって感謝します。

4

1 に答える 1

3

これは、p:dataTableが繰り返されるコンポーネントであり、ビューのビルド時にビュールートにカレンダーが1つしかないためです。IDがありsomeForm:someDataTable:someCalendarます。

ビューのレンダリング時にのみ、テーブルの行が作成され、行に依存するIDが生成されます。

日付を確認するには、JSF組み込みの検証機能を使用する必要があります。

ビューで:

<p:calendar id="someCalendar" value=#{element.date} 
            validator="#{BackinBean.validateDate}"/>
<p:message id="someCalendarMessage" for="someCalendar"/>

(属性someCalendarfor十分です)

とバッキングBeanで:

public void validateDate(
               FacesContext context, 
               UIComponent component, 
               Object value) throws ValidatorException {

        if (/* date is not valid */) {
            throw new ValidatorException(
               new FacesMessage("Date is not valid"));
        }

}

検証メソッドからのFacesMessageは、正しいテーブル行に自動的に表示されます。

于 2012-05-15T06:11:15.063 に答える