1

JSFにソリューションが組み込まれていないview-param用の依存コンバーターを作成する必要があります。

この例barでは に依存していfooます。

<f:viewParam name="foo" value="#{bean.foo}" converter="#{appScopeBean.fooConverter}"/>
<f:viewParam name="bar" value="#{bean.bar}" converter="#{bean.barConverter}"/>

@PostConstructの変換された値はbean.fooまだ利用できませんが、リクエスト パラメータbarを手動で取得し、 Converterel ルックアップを実行することができました。

@PostConstruct
public void init()
{
    // mimic UIViewParameter behavior

    // grab request parameter manually
    final String fooId = context.getExternalContext().getRequestParameterMap().get("foo");

    // grab converter manually
    final Converter fooConverter = context.getApplication().evaluateExpressionGet(context,
        "#{appScopeBean.fooConverter}", Converter.class);

    final Foo foo = fooConverter.getAsObject(context, null, fooId);

    // create Bar converter dependent on Foo
}

を解決してコンバーターを取得しようとしましたUIViewParameterが、JSF ライフサイクルによってまだ設定されていないため、そのコンバーター インスタンスは nullです (なぜ? コンバーターの範囲が広い場合は安全なはずです)。したがって、コンバーターをルックアップして次のようなことを行うためのel式を取得したい(上記のDRYのようにハードコードする必要性を減らすため) :

@PostConstruct
public void init()
{
    // mimic UIViewParameter behavior

    final UIViewParameter fooViewParam = FacesContextUtils.getViewParam(context, "foo");

    // final Converter fooConverter = fooViewParam.getConverter(); is null

    // pseudo code
    final Converter fooConverter = context.getApplication().evaluateExpressionGet(context,
        fooViewParam.getConverterExpression(), Converter.class);

    final Foo foo = fooConverter.getAsObject(context, null, fooId);

    // create Bar converter dependent on Foo
}

UIViewParameterJSF は、各コンバーターのインスタンス化の後に呼び出される反復ライフサイクル Bean イベントなど、依存コンバーターのサポートを処理する必要があります。

4

0 に答える 0