2012-02-05 21 views
10

Tengo problemas para usar un componente compuesto JSF de la manera correcta. Puse algunos componentes juntos y todo estaba funcionando. Luego simplemente extraje el código en un componente compuesto y paso los atributos correspondientes y de repente recibo excepciones de conversación.Cómo pasar atributos a un componente compuesto

<composite:interface> 
    <composite:attribute name="selectedIDs" type="java.util.Collection" required="true"/> 
    <composite:attribute name="selectItems" type="java.util.List" required="true" />  
    <composite:attribute name="addAction" required="true"/> 
    <composite:attribute name="deleteAction" required="true"/> 
    <composite:attribute name="deleteButtonDisabled" /> 
    <composite:attribute name="ajaxListener" method-signature="void listener(javax.faces.event.AjaxBehaviorEvent)"/> 
</composite:interface> 
<composite:implementation> 
<div class="myClass"> 
    <h:outputStylesheet library="views" name="selectManyControlPanel.css" target="head" /> 

    <h:form> 
     <h:selectManyListbox value="#{cc.attrs.selectedIDs}"> 
      <f:selectItems value="#{cc.attrs.selectItems}" /> 
      <f:ajax render="delete" 
       listener="#{cc.attrs.ajaxListener}" /> 
     </h:selectManyListbox> 
     <br /> 
     <h:commandButton id="delete" value="Delete" 
      disabled="#{cc.attrs.deleteButtonDisabled}" 
      action="#{cc.attrs.deleteAction}" /> 
     <h:commandButton id="add" value="Add" action="#{cc.attrs.addAction}"/> 
    </h:form> 
</div> 
</composite:implementation> 

Aquí es la página en la que estoy usando el componente recién creado

<view:selectManyControlPanel 
      selectedIDs="#{bean.selectedIds}" 
      selectItems="#{bean.listOfSelectItems}" 
      addAction="#{bean.addNew}" 
      deleteAction="#{bean.deleteSelection}" 
      ajaxListener="#{bean.selectionChanged}" 
      deleteButtonDisabled="#{bean.deleteButtonDisabled}" /> 

Bean (algunos métodos omiten una parte cambiado de nombre)

package views; 

@SuppressWarnings("serial") 
@Named 
@RequestScoped 
public class Bean implements Serializable, IOverviewView { 

    @Inject 
    Presenter presenter; 
    private boolean deleteButtonDisabled; 

    private List<SelectItem> listOfSelectItems; 

    private Set<Long> selectedIds; 


    public Bean(){ 
     deleteButtonDisabled = true; 
     listOfSelectItems = new ArrayList<SelectItem>(10); 
    } 


    public void selectionChanged(AjaxBehaviorEvent event){ 
     if(selectedIds.isEmpty()) 
      deleteButtonDisabled = true; 
     else 
      deleteButtonDisabled = false; 
    } 

    public void deleteBikes(){ 
     presenter.delete(selectedIds); 
    } 

    public void addNew(){ 
     presenter.addNew(); 
    } 

    public List<SelectItem> getListOfSelectItems() { 
     return listOfSelectItems; 
    } 

    public Set<Long> getSelectedIds() { 
     return selectedIds; 
    }   

    @PostConstruct 
    public void init(){ 
     System.out.println("INITIALIZING BEAN: " + this.getClass().getName()); 
     this.presenter.setView(this); 
     this.presenter.init(); 
    } 

    public boolean isDeleteButtonDisabled() { 
     return deleteButtonDisabled; 
    } 

    @Override 
    public void setDeleteButtonEnabled(boolean isEnabled) { 
     deleteButtonDisabled = !isEnabled; 
    } 

    public void setListOfSelectItems(List<SelectItem> list) { 
     this.listOfSelectItems = list; 
    } 

    public void setSelectedIds(Set<Long> selectedIds) { 
     this.selectedIds = selectedIds; 
    } 


    @Override 
    public void updateBikesList(Set<ViewObject> objectsToDisplay) { 
     updateList(objectsToDisplay); 
    } 


    private void updateList(Set<ViewObject> objectsToDisplay){ 
     listOfSelectItems.clear(); 
     for (ViewObject vO : objectsToDisplay) { 
      final String label = vO.getManufacturer() + ", " + vO.getModel() + " (" + vO.getYear() + ")"; 
      listOfSelectItems.add(new SelectItem(vO.getId(), label)); 
     } 
    } 
.... 

} 

Excepción

javax.el.ELException: /resources/views/selectManyControlPanel.xhtml @25,56 value="#{cc.attrs.selectedIDs}": /index.xhtml @21,70 selectedIDs="#{bean.selectedIds}": Cannot convert [Ljava.lang.String;@1e92093 of type class [Ljava.lang.String; to interface java.util.Set 

Lo único que cambiado es que estoy usando la composición en lugar del código simple. Las expresiones EL siguen siendo las mismas. Alguien puede iluminarme, por favor? Esperaba que los parámetros acabaran de pasar, pero obviamente no ...

+0

Creo que va a necesitar para publicar el getter para la propiedad bean selectedIds. – AlanObject

+0

Agregué el frijol a la pregunta – lostiniceland

Respuesta

11

Esto está relacionado con Mojarra issue 2047. Está programado para ser arreglado en el próximo 2.2.

El billete cuestión también propone la siguiente solución:

<view:selectManyControlPanel 
    selectedIDsBean="#{bean}" 
    selectedIDsProperty="selectedIds" 

con interfaz CC

<composite:attribute name="selectedIDsBean" required="true"/> 
<composite:attribute name="selectedIDsProperty" required="true"/> 

y en la ejecución de CC

<h:selectManyListbox value="#{cc.attrs.selectedIDsBean[cc.attrs.selectedIDsProperty]}"> 
+0

Hola. La propiedad en el bean es un conjunto (conjunto privado selectedds) con getter y setter. Como se mencionó, todo funcionó sin extraer al componente compuesto. Cuando se utiliza la versión xhtml simple y el mismo bean exacto todo está funcionando como se esperaba. – lostiniceland

+0

Hmm, ¿qué versión/versión JSF estás usando? – BalusC

+0

JBoss 7.1 CR1 que usa Mojarra (el jsf-impl tiene la versión 2.1.5 en la carpeta modules) – lostiniceland

Cuestiones relacionadas