Note that there are some explanatory texts on larger screens.

plurals
  1. POJSF 2 , Primefaces 4.0. p:dataTable sorting using complex sortBy expression
    primarykey
    data
    text
    <p>Suppose you have bean which holds cars table model, let's call this bean carManager. Let's assume that there exists another bean, which can take cars table model element and get proper translation based on selected language, let's call that bean carProcessor. So, now we can make a data table like this:</p> <pre><code>&lt;p:dataTable var="car" value="#{carManager.tableModel}"&gt; &lt;p:column headerText="Car name" sortBy="#{carProcessor.getCarTranslateByLanguageId(car.data, carManager.selectedLanguage.id).name}"&gt; &lt;h:outputText value="#{carProcessor.getCarTranslateByLanguageId(car.data, carManager.selectedLanguage.id).name}"/&gt; &lt;/p:column&gt; &lt;p:column headerText="Description" sortBy="#{carProcessor.getCarTranslateByLanguageId(car.data, carManager.selectedLanguage.id).description}"&gt; &lt;h:outputText value="#{carProcessor.getCarTranslateByLanguageId(car.data, carManager.selectedLanguage.id).description}"/&gt; &lt;/p:column&gt; &lt;/p:dataTable&gt; </code></pre> <p>This is the structure of car object:</p> <pre><code>public class Car{ List&lt;Translation&gt; translation = new ArrayList&lt;Translation&gt;(); public List&lt;Translation&gt; getTranslation() { return translation; } public void setTranslation(List&lt;Translation&gt; translation) { this.translation = translation; } } </code></pre> <p>Here is translation class:</p> <pre><code>public class Translation{ private name = ""; private description = ""; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return this.description; } public void setDescription(String description) { this.description = description; } } </code></pre> <p>There was discussion going on <a href="http://forum.primefaces.org/viewtopic.php?f=3&amp;t=33892&amp;start=10" rel="nofollow">http://forum.primefaces.org/viewtopic.php?f=3&amp;t=33892&amp;start=10</a> , and it seems that my row sorting should work, but it doesn't. As soon as I try to open that page, null pointer exception shows up. </p> <p>Here is my stack trace:</p> <pre><code>org.apache.myfaces.view.facelets.el.ContextAwareELException: javax.el.ELException: java.lang.NullPointerException org.apache.myfaces.view.facelets.el.ContextAwareTagValueExpression.getValue(ContextAwareTagValueExpression.java:104) javax.faces.component._DeltaStateHelper.eval(_DeltaStateHelper.java:266) org.primefaces.component.column.Column.getSortBy(Column.java:95) org.primefaces.component.datatable.DataTableRenderer.encodeColumnHeader(DataTableRenderer.java:325) org.primefaces.component.datatable.DataTableRenderer.encodeThead(DataTableRenderer.java:595) org.primefaces.component.datatable.DataTableRenderer.encodeRegularTable(DataTableRenderer.java:247) org.primefaces.component.datatable.DataTableRenderer.encodeMarkup(DataTableRenderer.java:211) org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:83) javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:665) javax.faces.component.UIData.encodeEnd(UIData.java:1704) org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:74) org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:57) org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:72) org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:57) org.primefaces.extensions.component.layout.LayoutPaneRenderer.encodeBegin(LayoutPaneRenderer.java:152) javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:587) javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:517) javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:541) </code></pre> <hr> <h2>Update</h2> <p>It turned out that </p> <pre><code>sortBy="#{carProcessor.getCarTranslateByLanguageId(car.data, carManager.selectedLanguage.id).name}" </code></pre> <p>carProcessor method getCarTranslateByLanguageId gets argument car.data as null. This is where null pointer exception comes from, even though </p> <pre><code> &lt;h:outputText value="#{carProcessor.getCarTranslateByLanguageId(car.data, carManager.selectedLanguage.id).name}"/&gt; </code></pre> <p>works as expected. How can I fix that?</p> <hr> <h2>Update2</h2> <p>There is opinion that </p> <pre><code>sortBy="#{carProcessor.getCarTranslateByLanguageId(car.data, carManager.selectedLanguage.id).name}" </code></pre> <p>and</p> <pre><code>&lt;h:outputText value="#{carProcessor.getCarTranslateByLanguageId(car.data, carManager.selectedLanguage.id).name}"/&gt; </code></pre> <p>are rendered at the different times so this is why car.data is allways null when passing to the carProcessor.getCarTranslateByLanguageId method and this is why it is not the null then simply printing value out in column.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload