2012-02-05 16 views
10

पर विशेषताओं को कैसे पास करें मुझे सही तरीके से जेएसएफ समग्र-घटक का उपयोग करने में परेशानी हो रही है। मैंने कुछ घटकों को एक साथ रखा और सब कुछ काम कर रहा था। तब मैंने कोड को एक समग्र घटक में निकाला, और इसी विशेषताओं को पारित कर दिया और अचानक मुझे बातचीत अपवाद मिल रहे हैं।एक समग्र घटक

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

यहाँ पृष्ठ जहाँ मैं नव निर्मित घटक

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

बीन उपयोग कर रहा हूँ

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

} 

अपवाद

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 

(कुछ तरीकों एक भागों का नाम बदला छोड़ दिया) है केवल एक चीज है कि बदल गया है कि मैं सादा कोड के बजाय संरचना का उपयोग कर रहा हूँ। ईएल-अभिव्यक्ति अभी भी वही हैं। क्या कोई मुझे कृपया प्रबुद्ध कर सकता है? मुझे उम्मीद थी कि पैरामीटर बस पारित हो गए हैं लेकिन स्पष्ट रूप से नहीं ...

+0

मुझे लगता है कि आप पोस्ट करने के लिए की जरूरत करने जा रहे हैं बीन संपत्ति चयनित आईडी के लिए गेटर। – AlanObject

+0

मैंने प्रश्न – lostiniceland

उत्तर

11

यह Mojarra issue 2047 से संबंधित है। यह आगामी 2.2 में तय किया जाना निर्धारित है।

मुद्दा टिकट भी निम्न वैकल्पिक हल का प्रस्ताव: सीसी इंटरफ़ेस में साथ

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

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

और सीसी कार्यान्वयन में

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

हाय पर बीन जोड़ा। बीन में संपत्ति एक सेट (निजी सेट चयनित आईडी;) गेटटर और सेटर के साथ है। जैसा कि बताया गया है, सब कुछ समग्र घटक को निकाले बिना काम किया। सादा xhtml-version का उपयोग करते समय और सटीक वही बीन सबकुछ अपेक्षित के रूप में काम कर रहा है। – lostiniceland

+0

हम्म, आप जेएसएफ इंप/संस्करण का उपयोग कर रहे हैं? – BalusC

+0

जेबॉस 7.1 सीआर 1 जो मोजाररा का उपयोग करता है (जेएसएफ-इम्प्ल्यू में मॉड्यूल-फ़ोल्डर में संस्करण 2.1.5 है) – lostiniceland

संबंधित मुद्दे