以下に示すように、JSF ページ<f:viewParam>
のタグ内に2 つのタグが含まれています。<f:metaData>
index.xhtml ファイル:
<h:form id="form" prependId="true">
<f:metadata>
<f:viewParam name="userId" id="paramId" rendered="#{not empty param.userId}" converter="#{userRoleConverter}" value="#{testManagedBean.userTable}"/>
<f:viewParam name="userRoleId" id="userParamId" rendered="#{not empty param.userRoleId}" converter="#{userAuthorityRowSelectionConverter}" value="#{testManagedBean.entity}"/>
<f:event type="preRenderView" listener="#{testManagedBean.preRenderEvent}" />
</f:metadata>
<p:messages id="messages" globalOnly="false" showDetail="true" showSummary="false" autoUpdate="false" closable="true"/>
</h:form>
converter
それらのそれぞれは、属性で指定されたコンバーターに関連付けられています。
2つのパラメーター(userId
およびuserRoleId
userTable
entity
testManagedBean
マネージド Bean:
@ManagedBean
@ViewScoped
public final class TestManagedBean implements Serializable
{
private UserRoles entity; //Both are POJOs.
private UserTable userTable;
public TestManagedBean(){}
//Setters and getters of both the properties entity and userTable.
public void preRenderEvent(ComponentSystemEvent event) throws AbortProcessingException
{
System.out.println((entity==null)+" : "+(userTable==null));
}
}
いずれかのプロパティで変換が失敗するuserId
とuserRoleId
、失敗したプロパティとともに他のプロパティもマネージド Bean に設定されず(この他のプロパティの変換は失敗する可能性が低いため、設定されることが期待されます)、両方のプロパティが設定されます。それらのヌルです。
たとえば、次のような URL を入力した場合、
/index.jsf?userId=100&userRoleId=12
次に、preRenderEvent()
メソッド内の次のステートメント ( に関連付けられている<f:event>
)、
System.out.println((entity==null)+" : "+(userTable==null));
が表示されますtrue : true
。
この場合、 の変換はuserId
失敗します (値 100 はデータベースに存在しません) が、 の変換はuserRoleId
成功する必要があり (ただし、そうではありません) 、null (データベースに存在する) であってはなりません。
同様に、次の URL、
/index.jsf?userId=1&userRoleId=120
再び表示されますtrue : true
。
前回と逆のケースです。userId
データベースには存在しますが、存在しuserRoleId
ません。
最後に、以下の URL、
/index.jsf?userId=1&userRoleId=12
を示していますfalse : false
。この場合の両方のパラメーターの値は、データベース内のそれぞれのテーブルに存在します。
ConverterException
変換の失敗は、言うまでもなくスローによって通知されます。
では、一方の変換が失敗したときに、両方のプロパティの値が null に設定されるのはなぜでしょうか? コンバーターの 1 つの変換が失敗した場合、コンバーターの 1 つだけが実行されますか?