seleccione la casilla de verificación Todos en JSF sin usar Javascript

Estoy tratando de seleccionar / deseleccionar todas las casillas de verificación en la tabla de datos usando una sola casilla de verificación. Como estoy intentando configurarlo en el servidor, no puedo hacerlo. He buscado soluciones, pero no pude entender cómo lograrlo en el lado del servidor.

Aquí está el código.

archivo xhtml ###

<rich:column styleClass="center-aligned-text">
         <f:facet name="header">
          <h:selectBooleanCheckbox id="selectAll" title="selectAll" valueChangeListener="#{workspace.selectAllComponents}">
           <a4j:support event="onclick" reRender="listcomponents"/>
          </h:selectBooleanCheckbox>
         </f:facet>

         <h:selectBooleanCheckbox id="selectComponent" 
          value="#{workspace.selectedComponentIds[componentInfo.id]}">
         </h:selectBooleanCheckbox>
        </rich:column>

Archivo Java

// Select All and delete
 public void selectAllComponents(ValueChangeEvent event){

  // If the check all button is checked, set all the checkboxes as selected 
  if(!selectAll)
  {
   changeMap(selectedComponentIds,true);
   setSelectAll(true);
  }
  else // If the button is unchecked, unselect all the checkboxes
  { 
   changeMap(selectedComponentIds,false);
   setSelectAll(false);
  }
 }

 public void changeMap(Map<Long,Boolean> selectedComponentMap, Boolean blnValue){
  if(selectedComponentMap != null){
   Iterator<Long> itr = selectedComponentMap.keySet().iterator();
   while(itr.hasNext()){
    selectedComponentMap.put(itr.next(), blnValue);
   }
   setSelectedComponentIds(selectedComponentMap);
  }
 }

Estoy marcando todos los valores en la lista comotrue&nbsp;cuando la casilla de verificación está marcada yfalse&nbsp;cuando no está marcado

Pero la página no vuelve a cargar los datos correctamente.

¿Es correcto mi método para abordar el problema? ¿O hay una alternativa eficiente?