プログラムで生成された Primefaces UIComponent のぼかしイベントに通常の Bean 検証をアタッチしようとしています。
xhtml を使用して手動でコンポーネントを作成すると、正常に動作します。次のようになります。
<p:inputText id="customerName" value="#{editCustomerBean.name}" label="Name">
<p:ajax async="true" event="blur" update="customerName, customerNameMsg" />
</p:inputText>
残念ながら、ランタイム データに基づいて入力される動的な属性があるため、このコンポーネントをその場で生成する必要があります。このコンポーネントを正確に再現するために私が書いたコード:
UIInput input = new InputText();
AjaxBehavior ajax = new AjaxBehavior();
ajax.setAsync(true);
ajax.setUpdate("customerName, customerNameMsg");
input.addClientBehavior("blur", ajax);
input.setId("customerName");
input.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{editCustomerBean.name}", String.class));
この方法でこのコンポーネントを生成すると、blur イベントでサーバーに送信されたリクエストが表示されますが、検証は行われません。投稿されるリクエストは、xhtml でコンポーネントを指定したときに送信されるリクエストと同じに見えます。
javax.faces.partial.ajax=true&javax.faces.source=mainForm%3AcustomerName&javax.faces.partial.execute=mainForm%3AcustomerName&javax.faces.partial.render=mainForm%3AcustomerName+mainForm%3AcustomerNameMsg&javax.faces.behavior.event=blur&javax.faces.partial.event=blur&mainForm%3AcustomerName=&javax.faces.ViewState=8176624577669857830%3A-4154840965136338204
この Web サイトと Primefaces フォーラムに投稿された同様の質問を見たことがありますが、通常は AjaxBehavior にリスナー メソッドをアタッチする必要があります。これは、ここで行おうとしていることではありません。リスナーが指定されていない場合、フィールドを検証するというタグと同じ動作にしたいと思います。