未对ValueExpression调用JSF自定义组件属性设置器

未对ValueExpression调用JSF自定义组件属性设置器,jsf,custom-component,Jsf,Custom Component,所以,我有一个非常恼人的问题。我已经创建了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

所以,我有一个非常恼人的问题。我已经创建了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接口为组件设置属性值,所以我希望这些设置器应该与
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>

柱
组件.列
提供
假的
java.lang.Boolean
看得见的
假的
java.lang.Boolean
分类
假的
搜索
假的
列标题
假的
java.lang.String
...
注意:我们不为dataTable和列使用primefaces或任何其他*faces库,因为它根本不满足我们的需要


我的二传手为什么不起作用,以及如何使它起作用?谢谢。

因为BalusC指出这种行为是预期的,所以我调试了
setValueExpression()
方法。因此,如果像我在问题中所做的那样,为属性提供
ValueExpression
,则不应调用setter(我认为应该这样)。值表达式由
setValueExpression
方法处理

问题是,当我调用
getSort()
getSearch()方法时,得到的是null(默认计算值)。所以我把我的getter编辑成这样:

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不调用提供的值表达式)并不是真正直观的,可能会令人困惑。

这在技术上是重复的。换句话说,它按预期工作。但是,由于你的问题暗示你有其他问题,这些问题似乎是由此引起的,所以告诉你到底面临什么问题以及为什么需要调用这些setter可能是有用的。谢谢,哥们!救了我一天!事实上,重复问题的正确答案更深入这件事,并以优雅的方式解决了这个问题。所以,对于像我一样最终来到这里的人,不要让我去检查重复的问题。