0

次の facelet コードは、employeeId inputText コンポーネントがフォーカスを失ったときにメッセージをレンダリングしますが、正常に実行されています...

<h:inputText id="employeeId" value="#{questionAnswerAction.questionAnswerActionForm.employeeId}" 
 required="true" requiredMessage="#{app:requiredFieldMessage(bundle, 'label.peoplesoftId')}"
 binding="#{questionAnswerAction.questionAnswerActionForm.employeeIdInputText}">
    <f:ajax event="blur" render="employeeIdMessage" />
</h:inputText>
<h:message id="employeeIdMessage" errorClass="deg-msg-error" infoClass="deg-msg-info" for="employeeId"></h:message>

ただし、何らかの理由で、別の facelet にほぼ同じコードを適用しようとすると (employeeId ではなく managerId 用であるという違いがあります)、ajax 呼び出しでトリガーされるセッターが発生すると (setEmployeeId上記の呼び出しで) 、私の SessionScoped ManagedProperty は、メソッドで null としてフラグが立てられています。ManagedProperty は、実際には SessionScoped ManagedBean そのものです。

このコードが 1 つのページで正常に機能しているのに、別の facelet で「設定」が発生すると、ManagedProperty が null として表示される理由がわかりません...

4

1 に答える 1

2

このbinding属性は、セッションスコープなど、リクエストスコープよりも広いスコープでBeanのプロパティにバインドされると問題を引き起こします。これは、基本的に、複数のページインクルード、ページビュー、ブラウザタブ間で物理的に同じJSFコンポーネントの状態を共有するためです。セッション全体を通して/windows。それを取り除くか、リクエストスコープのBeanに再バインドします。

次に、UIInputフィールドは、指定されたUIComponent(この場合はUIInputフィールド)にFacesContextメッセージを追加するメソッドに渡されます。

通常ValidatorまたはConverter機能要件に応じて使用し、コンポーネントに登録するだけです。ValidatorExceptionまたはを投げるとConverterException、ラップFacesMessageされたものは自動的に正しい場所に配置されます。このようにして、コンポーネントをバインドする必要がなくなります。

マネージャーBeanをRequestScopedに設定すると修正されました...これは奇妙なことです。従業員が管理するBeanをSessionScopedに設定すると、ajax機能が機能し始めたからです。

これは、 commandButton / commandLink / ajaxアクション/リスナーメソッドが呼び出されていないか、入力値が更新されていないポイント4と5によって回答されます。

于 2012-12-07T16:59:02.667 に答える