使用 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 标签的自定义排序功能,它有效。
有什么想法吗?
谢谢
我也遇到过类似的问题,我是这样解决的。
首先,我创建了一个 Sorter 类(助手),然后通过 EL 在我的 JSF 页面中使用它。
排序器.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>
我想出了一个解决方案/解决方法。我认为这是 Primefaces 3.5 在 p columns 标签和 sortFunction 属性上的错误。
Primefaces 需要
sortFunction="#{monitoraggioBean.customSort}"
上的方法表达式,但它希望将其视为值表达式并尝试查找 getter/setter 方法。
我的解决方法是为 sortFunction 中的名称方法定义“getter”,并在支持 bean 中创建方法表达式。
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(...),您可以在其中实现排序逻辑。
享受! :)
@Dani 你能告诉我更多关于ordina的信息吗?