2016-03-25 84 views
1

所以,我有一個非常惱人的問題。我創建JSF自定義組件類:JSF自定義組件屬性設置器沒有調用ValueExpression

@FacesComponent(value = Column.COMPONENT_TYPE) 
public class Column extends HtmlColumn { 
    ... 
    protected enum attr { 
     sort, search ... 

我有getter和setter方法爲所有attr的,他們看起來像:

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> 

它的工作原理,當我使用非價值表達價值觀,但在這種情況下是不是一種選擇。

這裏的標籤庫的一部分,如果這能幫助:

<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或任何其他*臉庫DataTable,並將列,因爲它根本就沒有滿足我們的需求。

任何說明爲什麼我的二傳手不工作,以及如何使它工作?謝謝。

+0

這在技術上是重複的http://stackoverflow.com/q/11866981。換句話說,它按預期工作。但是,由於你的問題意味着你有其他問題似乎是由此引起的,所以說出你確切地面對什麼問題以及爲什麼你需要這些設置者被調用可能是有用的。 – BalusC

回答

1

由於BalusC指出這種行爲是預期的,我調試我的方式爲setValueExpression()方法。所以如果你提供ValueExpression屬性,就像我在問題中所做的那樣,setter不應該被調用(我認爲它應該是)。值表達式由setValueExpression方法處理。

問題是我得到空(默認評估值),當我調用getSort()getSearch()方法。所以我編輯我的得到這樣的事情:

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不會對提供的值表達式進行調用)並不是很直觀,可能會令人困惑。

+0

謝謝,老兄!拯救了我的一天! –

+0

事實上,在重複問題上的正確答案在這件事情上更深入,並以優雅的方式解決了這個問題。所以,對於像我這樣最終在這裏結束的人,不要去查看重複的問題。 –

相關問題