2016-03-25 4 views
1

Also, ich habe ein wirklich nerviges Problem. Ich habe JSF erstellt individuelle Komponentenklasse:JSF Benutzerdefinierte Komponente Attribut-Setter nicht aufgerufen ValueExpression

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

Ich habe Getter und Setter für alle der attr und sie sehen wie folgt aus:

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); 
} 

Da ich verwende StateHelper Schnittstelle Attributwerte festlegen für eine Komponente, ich erwarte, dass diese Setter mit ValueExpression arbeiten sollten, aber sie sind nicht.

Hier ist Snippet .xhtml wo ich versuche, zu sortieren und die Suche auf Attribute:

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

Es funktioniert, wenn ich nicht wertExpressionsWerte verwenden, aber in diesem Fall ist keine Option.

Hier ist Teil taglib, ob das hilft:

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

HINWEIS: Wir verwenden keine primefaces oder andere * Gesichter Bibliothek für Datatable und Spalten, weil es einfach ist nicht unsere Bedürfnisse dienen.

Irgendwelche Gründe, warum meine Setter nicht funktioniert und wie es funktioniert? Vielen Dank.

+0

Dies ist technisch ein Duplikat http://stackoverflow.com/q/11866981. Mit anderen Worten, es funktioniert wie erwartet. Aber da Ihre Frage impliziert, dass Sie andere Probleme haben, die dadurch verursacht werden, ist es vielleicht nützlich zu sagen, welche Probleme genau Sie hatten und warum genau diese Setter aufgerufen werden müssen. – BalusC

Antwort

1

Seit BalusC wies darauf hin, dass dieses Verhalten erwartet wird, debuggte ich meinen Weg zu setValueExpression() Methode. Also, wenn Sie ValueExpression zu einem Attribut bereitstellen, wie ich in der Frage, Setter sollte nicht aufgerufen werden (ich dachte, es sollte sein). Wert Ausdruck wird von setValueExpression Methode behandelt.

Das Problem war, dass ich Null (Standardwert bewerteten Wert) bekam, wenn ich getSort() oder getSearch() Methoden aufgerufen. Also habe ich meine Getters auf etwas wie dieses bearbeitet:

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

Jetzt funktioniert alles gut. Ich muss jedoch darauf hinweisen, dass dieses Verhalten (der Setter wird nicht auf dem angegebenen Wertausdruck aufgerufen) nicht wirklich intuitiv ist und möglicherweise verwirrend ist.

+0

Danke, Alter! Habe meinen Tag gerettet! –

+0

In der Tat, die richtige Antwort auf doppelte Frage geht tiefer in dieser Angelegenheit und löst dieses Problem auf elegante Weise. Also, für diejenigen, die wie ich hier gelandet sind, lasst euch die doppelte Frage nicht ansehen. –