JSF 2,Primefaces 4.0. p:使用复杂sortBy表达式进行数据表排序 [英] JSF 2 , Primefaces 4.0. p:dataTable sorting using complex sortBy expression

查看:171
本文介绍了JSF 2,Primefaces 4.0. p:使用复杂sortBy表达式进行数据表排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设您有一个保存cars表模型的bean,我们称之为bean carManager. 假设存在另一个bean,它可以采用cars表模型元素并根据所选语言获得正确的翻译,我们将该bean称为carProcessor.因此,现在我们可以制作一个数据表,如下所示:

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:dataTable var="car" value="#{carManager.tableModel}">
    <p:column headerText="Car name" sortBy="#{carProcessor.getCarTranslateByLanguageId(car.data, carManager.selectedLanguage.id).name}">
        <h:outputText value="#{carProcessor.getCarTranslateByLanguageId(car.data, carManager.selectedLanguage.id).name}"/>
    </p:column>
    <p:column headerText="Description" sortBy="#{carProcessor.getCarTranslateByLanguageId(car.data, carManager.selectedLanguage.id).description}">
        <h:outputText value="#{carProcessor.getCarTranslateByLanguageId(car.data, carManager.selectedLanguage.id).description}"/>
    </p:column>
</p:dataTable>

这是汽车对象的结构:

public class Car{
    List<Translation> translation = new ArrayList<Translation>();

    public List<Translation> getTranslation()
    {
         return translation;
    }

    public void setTranslation(List<Translation> translation)
    {
         this.translation = translation;
    }
}

这是翻译班:

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

http://forum上正在进行讨论.primefaces.org/viewtopic.php?f = 3& t = 33892& start = 10 ,似乎我的行排序应该可以,但不能.一旦我尝试打开该页面,就会出现空指针异常.

There was discussion going on http://forum.primefaces.org/viewtopic.php?f=3&t=33892&start=10 , 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.

这是我的堆栈跟踪:

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)


更新

原来是


Update

It turned out that

sortBy="#{carProcessor.getCarTranslateByLanguageId(car.data, carManager.selectedLanguage.id).name}" 

carProcessor方法getCarTranslateByLanguageId获取参数car.data为null.即使

carProcessor method getCarTranslateByLanguageId gets argument car.data as null. This is where null pointer exception comes from, even though

 <h:outputText value="#{carProcessor.getCarTranslateByLanguageId(car.data, carManager.selectedLanguage.id).name}"/> 

按预期工作.我该如何解决?

works as expected. How can I fix that?

有意见

sortBy="#{carProcessor.getCarTranslateByLanguageId(car.data, carManager.selectedLanguage.id).name}"

<h:outputText value="#{carProcessor.getCarTranslateByLanguageId(car.data, carManager.selectedLanguage.id).name}"/> 

是在不同的时间渲染的,因此这就是为什么在传递给carProcessor.getCarTranslateByLanguageId方法时car.data始终为null的原因,这就是为什么它不是null而是仅将值打印到列中的原因.

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.

推荐答案

我设法通过在Car类中添加getTranslatedName()和getTranslatedDescription()来解决此问题.这是因为您无法将参数从list传递给sortBy =". 因此,基本上,您需要在getTranslatedName()和getTranslatedName()方法内调用负责语言管理的类,然后检查所有翻译,然后返回最终值,所以从现在开始,我的sortBy看起来像这样:

I managed to solve it by adding getTranslatedName() and getTranslatedDescription() in the Car class. It's because you can't pass arguments from list to sortBy="". So basically you need to call class which is responsible for language management inside the getTranslatedName() and getTranslatedName() methods and then check all translations, then return final value, so from now on my sortBy looks like this:

<p:column headerText="Car name" sortBy="getTranslatedName">
    <h:outputText value="#{car.getTranslatedName}"/>
</p:column>

这篇关于JSF 2,Primefaces 4.0. p:使用复杂sortBy表达式进行数据表排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆