2012-02-05 18 views
10

Bir JSF kompozit bileşenini doğru şekilde kullanırken sorun yaşıyorum. Bazı bileşenleri bir araya getirdim ve her şey çalışıyordu. Daha sonra kodu bir kompozit bileşenle çıkardım ve ilgili öznitelikleri geçtim ve aniden konuşma istisnaları alıyorum. İşte Bir kompozit bileşenle ilgili öznitelikler nasıl aktarılır

<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> 

Ben

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)); 
     } 
    } 
.... 

} 

İstisna

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 

(bazı yöntemler değiştirildi bir parça atlanır) yeni oluşturulan bileşeni

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

Bean kullanıyorum sayfası Tek şey şu ki değişti, düz kod yerine kompozisyonu kullanıyorum. EL ifadeleri hala aynı. Birisi beni aydınlatır mı lütfen? Parametreler sadece geçirilir, ancak açık olarak değil ...

+0

sana göndermek için ihtiyacımız olacak düşünüyorum Fasulye mülkünün alıcısı seçildi. – AlanObject

+0

Fasulyeyi – lostiniceland

cevap

11

Bu, Mojarra issue 2047 ile ilgilidir. Yaklaşan 2.2'de sabitlenmesi planlanıyor.

konu bilet ayrıca aşağıdaki geçici çözümü önermektedir: CC arayüzünde ile

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

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

ve CC uygulanmasında

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

Merhaba'a ekledim. Fasulyedeki özellik, bir set (özel Set selectedIds;) getter ve ayarlayıcıdır. Bahsedildiği gibi, her şey kompozit bileşenlere çıkmadan çalıştı. Düz xhtml sürümü ve tam olarak aynı fasulye kullanırken her şey beklendiği gibi çalışıyor. – lostiniceland

+0

Hmm, hangi JSF impl/sürümünü kullanıyorsunuz? – BalusC

+0

Mojarra'yı kullanan JBoss 7.1 CR1 (jsf-impl, modül-klasöründe 2.1.5 sürümüne sahiptir) – lostiniceland

İlgili konular