PrimeFacesの列コンポーネントをdataTable内に拡張しようとしています。主にヘッダーを作成し、関連するファセットを持つ列タグを手動で挿入することなく、キー値に基づいてオブジェクトのフィールドを自動挿入します。
DataTableRendererをオーバーライドするカスタムコンポーネントに次のものがあります。
@Override
public void encodeEnd(FacesContext context, UIComponent component)
throws java.io.IOException {
Object columnOrder = component.getAttributes().get("columnOrder");
if (columnOrder != null) {
component.getChildren().clear();
Application application = context.getApplication();
ExpressionFactory expressionFactory = application.getExpressionFactory();
Column column = new Column();
Object var = component.getAttributes().get("var");
String varKey = columnOrder.toString();
UIOutput header = (UIOutput) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
header.setValue(varKey);
column.getFacets().put("header", header);
ValueExpression valExpr = expressionFactory.createValueExpression("#{" + var + "." + varKey + "}", String.class);
UIOutput cell = (UIOutput) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
cell.setValueExpression("value", valExpr);
column.setStyleClass(varKey);
column.getChildren().add(cell);
component.getChildren().add(column);
component.getAttributes().remove("columnOrder");
}
super.encodeEnd(context, component);
}
そしてそれをそう呼んでいます
<my:dataTable var="item" value="#{myBean.collection}" columnOrder="field" />
ヘッダーは正しく設定されますが、セルは式を評価するのではなく、文字通り#{item.field}を出力します。
列コンポーネントのsetStyleClassも、目的の効果を発揮できません。
私はスティックの間違った端をつかんで、これについて間違った方向に進んでいると推測しています。
NB。この縮小された例では、columnOrderは単一の文字列であり、ヘッダーはバンドルで検索されるキーのリストではなく、単にキー値を使用すると想定しています。