我正在尝试在使用复合组件时设置支持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(注意:视图范围)。
还有其他办法吗?
答案 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视图,也可能在他的背后有一个类,只知道复合,而不知道范围。