使用Primefaces 3.5,当我尝试使用带动态列的自定义排序功能时,我得到PropertyNotFoundException
。
我在xhtml文件中的数据表是(只显示相关代码)
<p:dataTable id="dataTableVersioneMonitoraggio" var="row" value="# {monitoraggioBean.pacchetti}"
rowKey="#{row.pacchetto.id}">
<p:columns value="#{monitoraggioBean.columns}" var="column"
sortBy="#{row.celle[column.posizione].cella.valore}"
sortFunction="#{monitoraggioBean.customSort}">
...
</p:columns>
</p:dataTable>
视图范围支持bean中的不完整方法是:
public int customSort(Object val1, Object val2) {
System.out.println("mySort" + val1 + "/" + val2);
return 0;
}
问题是我无法在bean中使用此方法,并且出现以下错误:
GRAVE [javax.enterprise.resource.webcontainer.jsf.context] (http--0.0.0.0-8080-3) javax.el.PropertyNotFoundException: /monitoraggio.xhtml @80,161 sortFunction="#{monitoraggioBean.customSort}": The class 'com.packman.bean.MonitoraggioBean' does not have the property 'customSort'.
我尝试过使用p:column标签的自定义排序功能,它可以正常工作。
有什么想法吗?
由于
答案 0 :(得分:3)
我遇到了类似的问题,我就这样解决了。
首先,我创建了一个Sorter类(帮助器),然后我将通过EL在我的JSF页面中使用它。
Sorter.java
@Component
public class Sorter {
/**
* Compares two objects that are Strings on their int value. Can be used to sort any column that contains Integer-based data.
* @param obj1
* @param obj2
* @return
*/
public int sortIdByString(Object obj1,Object obj2){
int id1 = Integer.parseInt((String)obj1);
int id2 = Integer.parseInt((String)obj2);
if(id1 < id2){
return -1;
}else if(id1 == id2){
return 0;
}else{
return 1;
}
}
}
JSF页
<p:column headerText="#{msgs['page.customer.detail.vendingMachine.number']}"
sortBy="#{vendingMachine.nummer}" sortFunction="#{sorter.sortIdByString}">
<h:outputText value="#{vendingMachine.nummer}"/>
</p:column>
答案 1 :(得分:0)
我想出了一个解决方案/解决方法。我认为这是pofaces 3.5和sortFunction属性上的Primefaces 3.5的错误。
Primefaces期望sortFunction="#{monitoraggioBean.customSort}"
上的方法表达式,但它希望将其视为值表达式并尝试找出getter / setter方法。
我的解决方法是在sortFunction中为name方法定义“getter”,并在辅助bean中创建Method Expression。
public MethodExpression getOrdina() {
FacesContext context = FacesContext.getCurrentInstance();
return context.getApplication().getExpressionFactory().createMethodExpression(context.getELContext(), "#{monitoraggioBean.ordina}", Integer.class, new Class[]{Object.class, Object.class});
}
自定义排序的方法也必须在bean中定义:
public int customSort(Object val1, Object val2) {
System.out.println("mySort" + val1 + "/" + val2);
return 0;
}
通过这种方式,当您单击列标题时,首先调用getOrdina(),然后调用customSort(...),您可以在其中实现排序逻辑。
享受! :)