It isn’t possible to define columns based on row data. Imagine that row 1 has 2 columns, row 2 has 6 columns, row 3 has 1 column, etc how would you ever produce a technically valid table in HTML? Each row must have the same amount of columns.
You’ve 2 options, depending on whether can change the model or not:
-
If you can’t change the model, then you need to replace that
<p:columns>
by a single<p:column>
and loop over the#{data.optionalValues}
using a nested loop with e.g.<ui:repeat>
or perhaps even another<p:dataTable><p:columns>
:<p:column> <p:dataTable value=""><!-- Empty string as value forces 1 row. --> <p:columns value="#{data.optionalValues}" var="opt" headerText="#{opt.id}"> #{opt.value} </p:columns> </p:dataTable> </p:column>
-
If you can change the model, then you need to let
<p:columns value>
point to a bean property instead of to a row property, so that it’s exactly the same for every row. This works if you replaceList<Tupel> optionalValues
byMap<String, Tupel> optionalValues
where the key isTupel#id
and add aList<String>
property to the bean containing all availableTupel#id
values.<p:columns value="#{tableOverviewBean.availableTupelIds}" var="id" headerText="#{id}"> #{data.optionalValues[id].value} </p:columns>