如何从复合属性设置bean属性?

时间:2014-09-10 09:18:10

标签: jsf-2 attributes composite-component backing-beans

我正在尝试在使用复合组件时设置支持bean属性(支持bean是复合attribute)。

我想要有条件地填充属性的bean属性(例如,finalDraft)(有条件地,因为不需要该属性)。

支持bean:

class Bean ... {
   String finalDraft; // getters+setters

   @PostConstruct
   void init() {
       String draftAttr = (...) getAttributes("draft");
       if(draftAttr!=null) {
           finalDraft = draftAttr;
       }
   }
}

复合材料:

<composite:interface>
    <composite:attribute name="bean" required="true" ... />
    <composite:attribute name="draft" type="java.lang.String" />
</composite:interface>

到目前为止,我尝试使用getAttributes("draft") @PostConstruct内的bean,但它解析为null(注意:视图范围)。

还有其他办法吗?

1 个答案:

答案 0 :(得分:1)

只是不要将bean绑定到复合组件。直接通过酒店:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:composite="http://java.sun.com/jsf/composite"
    xmlns:h="http://java.sun.com/jsf/html">
    <h:body>
        <composite:interface>
            <composite:attribute name="showDraft" default="true" />
            <composite:attribute name="draft" />
        </composite:interface>
        <composite:implementation>
            <h:inputText value="#{cc.attrs.draft}" 
                rendered="#{cc.attrs.showDraft}" />
        </composite:implementation>
    </h:body>
</html>

然后您就可以在主页中使用它了:

<comp:draftInput value="#{bean.finalDraft}" />

<comp:draftInput showDraft="false" />

我担心你对这里的支持豆感到困惑。有一点是你当前的@ViewScoped bean中有的东西,另一件是复合组件。组合对当前视图的托管bean一无所知,它只接收参数并显示它们。它可能是单个facelet视图,也可能在他的背后有一个类,只知道复合,而不知道范围。