以编程方式覆盖 composite-component 属性的值表达式

Programmatically override value expression of composite-component’s attribute

我写了一个包装器组件,在某些情况下会覆盖其 children 的某些属性。

INVOKE_APPLICATION 阶段(事件之后),它在 child 组件上调用 UIComponent#setValueExpression :

FacesContext ctx = FacesContext.getCurrentInstance();
ELContext eLContext = ctx.getELContext();
ExpressionFactory factory = ctx.getApplication().getExpressionFactory();
String newModelExpression = "#{newExpression}";
ValueExpression exp = factory.createValueExpression(eLContext, newModelExpression, Object.class);
((UIComponent) child).setValueExpression("model", exp);  

一切正常 除了 composite-component 为 child。

With composite-component,值表达式在RENDER_RESPONSE阶段重置,初始表达式被评价。

这发生在 CompositeComponentTagHandler$CompositeComponentRule$CompositeExpressionMetadata#applyMetaData

有解决办法吗?

我在 jsf-impl Mojarra 2.2.12

中使用 Payara

刚刚调用 UIComponent#setValueExpression 进一步进行 PreRenderViewEvent 处理。