2008-11-21 5 views
5

में Iashate पर HashMap.values ​​() Iterate जेएसएफ/फेसलेट्स का उपयोग कर रहा हूं, और मैं कुछ दस्तावेज़ ऑब्जेक्ट्स (कस्टम ऑब्जेक्ट) पर पुन: प्रयास करने की कोशिश कर रहा हूं जिसे मैं हैश मैप में रख रहा हूं। जब पृष्ठ लोड हो जाता है, तो मुझे त्रुटि "प्रॉपर्टी 'नाम मिल रहा है जिसे java.util.HashMap $ Values" पर नहीं मिला है।जेएसएफ + फेसलेट

private Map<String, Document> documents = new HashMap<String, Document>(); 

public Collection<Document> getDocuments(){ 
    return documents.values(); 
} 

और मेरे एक्सएचटीएमएल पेज में:: यहाँ क्या मेरी समर्थन सेम में है अगर मैं निम्नलिखित करने के लिए getDocuments समारोह बदल

<h:dataTable id="documentTable" 
    value="#{DocumentManager.allDocuments}" 
    var="doc" rowClasses="list-row-odd, list-row-even" 
    headerClass="table-header" styleClass="bordered"> 

    <h:column id="col_name"> 
     <f:facet name="header">Name</f:facet> 
     ${doc.name} 
    </h:column> 
</h:dataTable> 

, यह काम करता है (जिसका अर्थ है तालिका त्रुटि के बिना प्रदर्शित किया जाता है), लेकिन मुझे यकीन नहीं है कि मुझे जेएसएफ/फेसलेट पेज के लिए सूची में मूल्यों को सही तरीके से प्रदर्शित करने की आवश्यकता क्यों है।

public List<Document> getDocuments(){ 
    List<Document> rtrn = new ArrayList<Document>(); 
    for(Document doc : documents.values()) 
     rtrn.add(doc); 
    return rtrn; 
} 

क्या मुझे संग्रह पर पुन: प्रयास करने में सक्षम नहीं होना चाहिए?

+2

एक तरफ, मुझे लगता है कि आप बस कॉल कर सकते हैं: नई ArrayList (document.values ​​()) लौटाएं – Josh

उत्तर

9

ठीक है, जैसा कि यह पता चला है, आप डेटाटेबल के साथ किसी भी प्रकार के संग्रह प्रकार का उपयोग नहीं कर सकते हैं, और अच्छे कारण के लिए। MyFaces 1.2 Spec से, मूल्य विशेषता होनी चाहिए:

एक ईएल अभिव्यक्ति है कि डाटा मॉडल कि इस तालिका पीठ निर्दिष्ट करता है।

ईएल अभिव्यक्ति द्वारा संदर्भित मान किसी भी प्रकार का हो सकता है।

  • डेटामोडेल प्रकार का एक मूल्य सीधे उपयोग किया जाता है। प्रकार Object[], java.util.List, java.sql.ResultSet या javax.servlet.jsp.jstl.sql.Result की
  • सरणी की तरह मापदंडों लिपटे रहे हैं में एक इसी DataModelthat जानता तत्वों से अधिक पुनरावृति करने के लिए कैसे।
  • अन्य मान एक डेटामोडेल में एक पंक्ति के रूप में लपेटे जाते हैं। विशेष रूप से

ध्यान दें कि अव्यवस्थित संग्रह, जैसे Set समर्थित नहीं हैं। इसलिए यदि मान अभिव्यक्ति इस तरह के ऑब्जेक्ट को संदर्भित करती है तो तालिका को केवल एक तत्व - संग्रह स्वयं माना जाएगा।

संग्रह HashSet.values ​​() से लौटाया गया संग्रह आदेश नहीं दिया गया है, इसलिए इसलिए समर्थित नहीं है। यदि ऐसा होता है, तो आपको पता नहीं होगा कि आपकी तालिका में पंक्तियां कितनी ऑर्डर आउटपुट होंगी, और पृष्ठ का रीफ्रेश उन्हें यादृच्छिक रूप से फिर से ऑर्डर कर सकता है। अच्छा नही।

आपको जो त्रुटि मिल रही है, वह अंतिम पैराग्राफ से है, यह कहता है कि डेटाटेबल आपके संग्रह को पंक्ति वस्तु के रूप में देख रहा है, और संग्रह में "नाम" संपत्ति नहीं है।