Primefaces columnas estáticas y dinámicas en tabla de datos

Estoy utilizando Primefaces 5.0 para crear una tabla de datos dinámica.

My DataObject tiene algunos campos obligatorios y una Lista de “tupel” opcional (par clave-valor). La lista opcional puede variar en tamaño. Por lo tanto, necesito un mecanismo dynamic para mostrar una lista de DataObject en Primefaces.DataTable.

Mi enfoque se ve así:

public class DataObject { private String staticval1; private String staticval2; private List optionalValues; // .. getter, setter, hashCode, toString..... } public class Tupel{ private String id; private String value; } @ManagedBean @ViewScoped public class TableOverviewBean { private List data; @EJB private IMyDao myDao; @PostConstruct public void init() { data = myDao.findAll(); } public List getData() { return data; } public void setData(List data) { this.data = data; } } 
   

Pero esto no funciona. Las columnas dinámicas no se representan. ¿Cómo puedo resolver mi problema?

EDITAR: resultado esperado:

 staticval1 | staticval2 | dynamic_id1 | dynamic_id2 | ... | dynmic_idn ---------------------------------------------------------------------- static1a | static2a | dyna_value1a| dyna_value2a | ... | dyna_valu3a static1b | static2b | dyna_value1b| dyna_value2b | ... | dyna_valu3b static1c | static2c | dyna_value1c| dyna_value2c | ... | dyna_valu3c 

No es posible definir columnas basadas en datos de fila. Imagine que la fila 1 tiene 2 columnas, la fila 2 tiene 6 columnas, la fila 3 tiene 1 columna, etc. ¿cómo podría alguna vez producir una tabla técnicamente válida en HTML? Cada fila debe tener la misma cantidad de columnas.

Tiene 2 opciones, dependiendo de si puede cambiar el modelo o no:

  1. Si no puede cambiar el modelo, debe reemplazar ese por un único y recorrer el #{data.optionalValues} utilizando un bucle nested con, por ejemplo, o tal vez incluso otra :

        #{opt.value}    
  2. Si puede cambiar el modelo, debe permitir que señale una propiedad de bean en lugar de una propiedad de fila, de modo que sea exactamente igual para cada fila. Esto funciona si reemplaza List optionalValues por Map optionalValues donde la clave es Tupel#id y agrega una propiedad List al bean que contiene todos los valores de Tupel#id disponibles.

      #{data.optionalValues[id].value}  

Java:

 @Named @ViewScoped public class LiveRangeService implements Serializable { private List< Map > tableData; private List tableHeaderNames; public List> getTableData() { return tableData; } public List getTableHeaderNames() { return tableHeaderNames; } public void PlayListMB() { tableData = new ArrayList< Map >(); //Generate table header. tableHeaderNames = new ArrayList(); for (int j = 0; j < 5; j++) { tableHeaderNames.add(new ColumnModel("header "+j, " col:"+ String.valueOf(j+1))); } //Generate table data. for (int i = 0; i < 10; i++) { Map playlist = new HashMap(); for (int j = 0; j < 5; j++) { playlist.put(tableHeaderNames.get(j).key,new ColumnModel(tableHeaderNames.get(j).key,"row:" + String.valueOf(i+1) +" col:"+ String.valueOf(j+1))); } tableData.add(playlist); } } static public class ColumnModel implements Serializable { private String key; private String value; public ColumnModel(String key, String value) { this.key = key; this.value = value; } public String getKey() { return key; } public String getValue() { return value; } } 

////////////////////////////////////////////

     header table             

Ese es un ejemplo.