Jsf 以编程方式将sortBy属性添加到primefaces数据表列

Jsf 以编程方式将sortBy属性添加到primefaces数据表列,jsf,datatable,primefaces,Jsf,Datatable,Primefaces,我试图通过编程方式将sortBy属性放入primefaces数据表列中。我继承了DataTable,并使用自定义的getColumns()调用创建了自己的列 不幸的是,似乎没有干净的方法将sortBy属性插入到列中,因为该方法还不知道它所在的上下文 public List<Column> getColumns() { if (columns == null) { columns = new ArrayList<Column>();

我试图通过编程方式将
sortBy
属性放入primefaces数据表
列中。我继承了DataTable,并使用自定义的
getColumns()
调用创建了自己的列

不幸的是,似乎没有干净的方法将sortBy属性插入到列中,因为该方法还不知道它所在的上下文

public List<Column> getColumns() {
    if (columns == null) {
        columns = new ArrayList<Column>();
        String[] columnStrings = getShowColumns().split(",");
        for (String columnString : columnStrings) {
            Column column = getColumnByType(columnString.trim());
            if (column != null) {
                //here I have to add the sortBy Expression somehow,
                //but there is no context to construct it from
                //column.setSortBy(ValueExpression)
                columns.add(column);
            }
        }
    }
    return columns;
}
public List getColumns(){
如果(列==null){
columns=newarraylist();
String[]columnStrings=getShowColumns().split(“,”);
for(字符串-列字符串:列字符串){
Column Column=getColumnByType(columnString.trim());
if(列!=null){
//这里我要加上一个肮脏的表情,
//但是没有上下文来构建它
//column.setSortBy(ValueExpression)
列。添加(列);
}
}
}
返回列;
}
对我来说似乎很明显,我错过了一些东西,但我现在迷失了方向。
似乎在其他地方填充了
值表达式
,但我找不到在哪里


我试图使用调试器检查所有代码,但我无法确定ValueExpression是在原始实现中何时生成的。感谢您的任何提示。

sortBy的
ValueExpression
如果列没有指定
sortBy
,则不会存储在任何位置,这是您的情况。您必须为每个应可排序的列创建自己的
ValueExpression

我假设您知道列类型和值,因此可以尝试以下方法:

Column column = getColumnByType(columnString.trim());
FacesContext facesContext = FacesContext.getCurrentInstance();
ELContext elContext = facesContext.getELContext();
ExpressionFactory elFactory = facesContext.getApplication().getExpressionFactory();
ValueExpression valueExpresion = elFactory.createValueExpression(elContext, column.getValue(), column.getType());
否则,如果您不知道类型和值:

 String valueExprs = "#{data.street}"; // for example
    ...
    Column column = getColumnByType(columnString.trim());
    ...
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ELContext elContext = facesContext.getELContext();
    ExpressionFactory elFactory = facesContext.getApplication().getExpressionFactory();
    ValueExpression valueExpression = elFactory.createValueExpression( elContext, valueExprs, String.class);
现在您可以通过以下方式设置sortBy:

column.setValueExpression("sortBy", valueExpression);
请注意,使用
column.setValueExpression
而不是
column.setSortBy
——这样可以减少故障,大部分时间都能正常工作


希望有帮助

如果列未指定
sortBy
,则
sortBy
ValueExpression
不会存储在任何位置,这是您的情况。您必须为每个应可排序的列创建自己的
ValueExpression

我假设您知道列类型和值,因此可以尝试以下方法:

Column column = getColumnByType(columnString.trim());
FacesContext facesContext = FacesContext.getCurrentInstance();
ELContext elContext = facesContext.getELContext();
ExpressionFactory elFactory = facesContext.getApplication().getExpressionFactory();
ValueExpression valueExpresion = elFactory.createValueExpression(elContext, column.getValue(), column.getType());
否则,如果您不知道类型和值:

 String valueExprs = "#{data.street}"; // for example
    ...
    Column column = getColumnByType(columnString.trim());
    ...
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ELContext elContext = facesContext.getELContext();
    ExpressionFactory elFactory = facesContext.getApplication().getExpressionFactory();
    ValueExpression valueExpression = elFactory.createValueExpression( elContext, valueExprs, String.class);
现在您可以通过以下方式设置sortBy:

column.setValueExpression("sortBy", valueExpression);
请注意,使用
column.setValueExpression
而不是
column.setSortBy
——这样可以减少故障,大部分时间都能正常工作


希望有帮助

非常感谢你。我不知道我可以在单例环境下工作。我仍然不知道上下文何时以及为什么通过引用传递,但这是一个完全不同的问题。再次感谢!不客气。您可以在任何与jsf相关的“对象”中提取上下文,如Bean、PhaseListener等。但是,您必须在单独的问题中提问,才能从更有经验的用户和专业人士(如BalusC)那里获得详细答案。非常感谢。我不知道我可以在单例环境下工作。我仍然不知道上下文何时以及为什么通过引用传递,但这是一个完全不同的问题。再次感谢!不客气。您可以在任何与jsf相关的“对象”中提取上下文,如bean、phaseListener等。但是,您必须在单独的问题中提问,才能从更有经验的用户和专业人士(如BalusC)那里获得详细的答案。