2222import java .util .ArrayList ;
2323import java .util .Arrays ;
2424import java .util .HashSet ;
25+ import java .util .Iterator ;
2526import java .util .List ;
2627import java .util .Map ;
2728import java .util .Set ;
@@ -218,7 +219,7 @@ private void generateBody(FacesContext context, DataTable dataTable, ResponseWri
218219 rw .writeText (value , null );
219220 }
220221
221- column . encodeChildren ( context );
222+ renderChildrenOfColumn ( column , context );
222223 rw .endElement ("td" );
223224 }
224225 rw .endElement ("tr" );
@@ -227,7 +228,27 @@ private void generateBody(FacesContext context, DataTable dataTable, ResponseWri
227228 rw .endElement ("tbody" );
228229 dataTable .setRowIndex (-1 );
229230 }
231+
232+ private void renderChildrenOfColumn (UIComponent column , FacesContext context ) throws IOException {
233+ resetClientIdCacheRecursively (column );
234+ column .encodeChildren (context );
235+ }
236+
237+ private void resetClientIdCacheRecursively (UIComponent c ) {
238+ String id =c .getId ();
239+ if (null != id ) {
240+ c .setId (id ); // this strange operation clears the cache of the clientId
241+ }
242+ Iterator <UIComponent > children = c .getFacetsAndChildren ();
243+ if (children != null ) {
244+ while (children .hasNext ()) {
245+ UIComponent kid = children .next ();
246+ resetClientIdCacheRecursively (kid );
247+ }
248+ }
249+ }
230250
251+
231252 private void generateHeader (FacesContext context , DataTable dataTable , ResponseWriter rw ) throws IOException {
232253 rw .startElement ("thead" , dataTable );
233254 rw .startElement ("tr" , dataTable );
0 commit comments