从UIViewParameter中检索转换器属性表达式

时间:2016-02-08 18:46:19

标签: jsf jsf-2 converter postconstruct viewparams

我需要为view-param创建一个依赖转换器,JSF没有内置的解决方案。

在此示例中,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转换后的值尚不可用,但我可以通过执行el查找手动检索请求参数barConverter

@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生命周期设置(为什么?如果转换器范围更广,则应该是安全的)。 所以我想获得el-expression来查找转换器以执行类似的操作(以减少将其硬编码为上面的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
}

JSF应该处理对依赖转换器的支持,例如在每个UIViewParameter转换器实例化之后调用的迭代生命周期bean事件。

0 个答案:

没有答案