2

以下に示すように、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およびuserRoleIduserTableentitytestManagedBean

マネージド 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));
    }
}

いずれかのプロパティで変換が失敗するuserIduserRoleId、失敗したプロパティとともに他のプロパティもマネージド 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 つだけが実行されますか?

4

1 に答える 1