从复合组件中获取bean类

时间:2015-11-10 07:18:53

标签: jsf jsf-2 facelets composite-component

我有复合组件:

<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并通过beanui: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课程。我该怎么办?

2 个答案:

答案 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();
}