login.jspとmain.jspの2つのJSPで構成されるJSFアプリケーションがあります。
私は次のfaces-config.xmlを持っています:
<lifecycle>
<phase-listener>package.programs.scorecard.beans.EventBean</phase-listener>
</lifecycle>
<managed-bean>
<managed-bean-name>FormBean</managed-bean-name>
<managed-bean-class>package.programs.scorecard.beans.FormBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>DataBean</managed-bean-name>
<managed-bean-class>package.programs.scorecard.beans.DataBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>EventBean</managed-bean-name>
<managed-bean-class>package.programs.scorecard.beans.EventBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
そして、次のweb.xml:
<welcome-file-list>
<welcome-file>faces/login.jsp</welcome-file>
<welcome-file>faces/index.jsp</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
login.jspに、commandLinkクリックでDataBeanのプロパティを更新するコンポーネントがいくつかあります。正常に完了すると、ユーザーは/main.jspに移動します。
commandLinkをクリックすると、Beanが更新される前にメソッドが実行されることに気付きました。これにより、フォームの値がBeanに適用されていないため、メソッドの実行時にすべてのBeanプロパティがnullになります。
JSFのライフサイクルについて私が理解したことから、「immediate = true」が指定されていない限り、「InvokeApplication」の前に「UpdateModelValues」を実行する必要があります。これは私のcommandLinkではありません。
私は今朝数時間これをデバッグしようとしてきました、そして私はどんな提案や洞察も歓迎します。
更新:私はこの問題を徹底的に調査し、使用していたドロップダウンコンポーネントにバグがあり、次のリリースで修正する必要があると結論付けました。私の解決策は、サードパーティコンポーネントの代わりに通常のh:selectOneMenuを使用することでしたが、これは魅力のように機能します。
<h:selectOneMenu id="ddlManager" value="#{DataBean.managerId}">
<f:selectItems value="#{DataBean.managerList}" />
</h:selectOneMenu>
ここで、managerListはSelectItemオブジェクトのリストです。