所以,我有一个非常讨厌的问题。我创建了JSF自定义组件类:
@FacesComponent(value = Column.COMPONENT_TYPE)
public class Column extends HtmlColumn {
...
protected enum attr {
sort, search ...
我为所有attr
设置了setter和getter,它们看起来像这样:
public void setSort(java.lang.Object sort) {
getStateHelper().put(attr.sort, sort);
}
public java.lang.Object getSort() {
return getStateHelper().eval(attr.sort, null);
}
public void setSearch(java.lang.Object search) {
getStateHelper().put(attr.search, search);
}
public java.lang.Object getSearch() {
return getStateHelper().eval(attr.search, null);
}
由于我使用StateHelper接口为组件设置属性值,因此我希望这些setter可以与ValueExpression
一起使用,但它们并非如此。
以下是.xhtml的片段,其中我尝试设置排序和搜索属性:
<e:dataTable id="datatable" var="entity" value="#{output.entities}"
entryId="#{entity.id}">
<e:column columnHeader="ID" sort="#{entity.id}" search="#{entity.id}">
<h:outputText value="#{entity.id}"/>
</e:column>
当我使用非值表达式值时,它可以工作,但在这种情况下不是一个选项。
如果有帮助的话,这里是taglib的一部分:
<tag>
<tag-name>column</tag-name>
<component>
<component-type>component.Column</component-type>
</component>
<attribute>
<name>rendered</name>
<required>false</required>
<type>java.lang.Boolean</type>
</attribute>
<attribute>
<name>visible</name>
<required>false</required>
<type>java.lang.Boolean</type>
</attribute>
<attribute>
<name>sort</name>
<required>false</required>
</attribute>
<attribute>
<name>search</name>
<required>false</required>
</attribute>
<attribute>
<name>columnHeader</name>
<required>false</required>
<type>java.lang.String</type>
</attribute>
...
</tag>
注意:我们不对数据表和列使用primefaces或任何其他* faces库,因为它根本不能满足我们的需求。
为什么我的二传手不能工作以及如何让它工作?感谢。
答案 0 :(得分:1)
由于BalusC指出这种行为是预期的,我调试了setValueExpression()
方法。因此,如果您提供ValueExpression
属性,就像我在问题中所做的那样,不应该调用setter(我认为它应该是)。值表达式由setValueExpression
方法处理。
问题是当我调用getSort()
或getSearch()
方法时,我得到null(默认评估值)。所以我编辑了这样的东西:
public java.lang.Object getSort() {
Object sort = getStateHelper().eval(attr.sort, null);
if (sort == null) {
ValueExpression ve = getValueExpression("sort");
if (ve != null) {
ELContext context = FacesContext.getCurrentInstance().getELContext();
sort = ve.getValue(context);
}
}
return sort;
}
现在一切正常。但我必须指出,这种行为(setter没有调用提供的值表达式)不是很直观,可能会让人感到困惑。