0

プログラムで生成された 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 にリスナー メソッドをアタッチする必要があります。これは、ここで行おうとしていることではありません。リスナーが指定されていない場合、フィールドを検証するというタグと同じ動作にしたいと思います。

4

2 に答える 2

1

ajax コンポーネントを見て、間違ったツリーを鳴らしていたことが判明しました。今日、コンポーネントが送信時に検証されていないことに気付きました。JSF コンポーネントを動的に作成する場合、コンポーネントに BeanValidator を手動で登録する必要があることがわかりました。この質問に答えてくれた victor herrera に感謝します: https://stackoverflow.com/a/7055586/1535568

于 2012-10-12T14:37:24.703 に答える