我需要为 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
尚不可用,但我可以手动检索请求参数bar
并Converter
通过执行 el 查找。
@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 表达式来查找转换器以执行类似的操作(以减少对上面 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 事件。