【问题标题】:JSF Custom component attribute setter not called on ValueExpression [duplicate]未在 ValueExpression 上调用 JSF 自定义组件属性设置器 [重复]
【发布时间】:2016-03-25 08:06:24
【问题描述】:

所以,我有一个非常烦人的问题。我已经创建了 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 的 sn-p:

<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>

注意:我们不会对 dataTable 和列使用 primefaces 或任何其他 *faces 库,因为它根本不能满足我们的需求。

任何想法为什么我的二传手不工作以及如何让它工作?谢谢。

【问题讨论】:

  • 这在技术上是重复的stackoverflow.com/q/11866981。换句话说,它按预期工作。但是,由于您的问题暗示您遇到了似乎由此引起的其他问题,因此告诉您究竟面临哪些问题以及为什么需要调用这些设置器可能会很有用。

标签: jsf custom-component


【解决方案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 不调用提供的值表达式)不是很直观,可能会令人困惑。

【讨论】:

  • 谢谢,伙计!拯救了我的一天!
  • 事实上,重复问题的正确答案在这件事上更深入,并以优雅的方式解决了这个问题。所以,对于像我一样最终来到这里的人,不要让检查重复的问题。
猜你喜欢
  • 2013-07-30
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
相关资源
最近更新 更多