我有复合组件:
<my:component value="#{bean.property1.property2}/>
从复合组件我需要获取bean.property1
的类来读取它的注释。
我是通过以下代码完成的:
ValueExpression valueExpression = expressionFactory.createValueExpression(FacesContext.getCurrentInstance().getELContext(),
"#{bean.property1}", Object.class);
Object bean = valueExpression.getValue(FacesContext.getCurrentInstance().getELContext());
Class<?> beanClass = bean.getClass();
这很有效,但是如果我使用小面孔中的my:component
并通过bean
将ui:param
作为参数传递,则这不起作用,因为bean
无法生效解决。
我可能会FaceletContext
使用ELContext
代替FacesContext.getCurrentInstance().getELContext()
:
FaceletContext faceletElContext = (FaceletContext) FacesContext.getCurrentInstance().getAttributes()
.get("javax.faces.FACELET_CONTEXT");
但这不适用于RENDER_RESPONSE
阶段(来自encodeBegin
方法)。它返回上次使用的ELContext而不是实际上下文(我并不感到惊讶:))。
目标是从#{bean.property1}
获得my:component
课程。我该怎么办?
答案 0 :(得分:0)
使用RichFaces
:
ValueExpressionAnalayser analyser = new ValueExpressionAnalayserImpl();
ValueDescriptor valueDescriptor = analyser.getPropertyDescriptor(context, valueExpression);
Class<?> beanClass = valueDescriptor.getBeanType();
这对我来说没问题。
ValueExpressionAnalayzer
包中还有javax.faces.validator
,但它是私有的,无法使用。
答案 1 :(得分:0)
您可以将bean作为参数传递给组件。
1)在组件接口文件中声明属性(如果使用复合组件):
<cc:interface componentType="myComponentClass">
<cc:attribute name="myBean" preferred="true"/>
..others attributes
<cc:interface>
2)为&#34; myBean&#34;实现相应的getter和setter。组件类中的属性(myComponentClass)
protected enum PropertyKeys {
myBean;
String toString;
PropertyKeys(String toString) {
this.toString = toString;
}
PropertyKeys() {}
@Override
public String toString() {
return ((this.toString != null) ? this.toString : super.toString());
}
}
public YourBeanClass getMyBean() {
return (YourBeanClass) getStateHelper().eval(PropertyKeys.myBean, null);
}
public void setMyBean(YourBeanClass myBean) {
getStateHelper().put(PropertyKeys.myBean, myBean);
}
3)在jsf页面上设置属性:
<my:component myBean="#{bean}"/>
4)在组件的渲染类中,将UIComponent转换为myComponentClass。
@Override
public void encodeBegin(FacesContext pContext, UIComponent pComponent)
throws IOException {
myComponentClass myComponent = (myComponentClass) pComponent;
myComponent.getYourAttribute();
}