2010-12-29 14 views
7

मैं कुछ इस तरह के साथ समूहीकृत चयन के साथ काम कर की कोशिश की है:JSF 2: चयन SelectItemGroup + POJO साथ समूहीकरण

<h:selectOneMenu value="#{selectionLabBean.oneSelectMenuGroup}" 
    id="SelectOneMenuGroup" > 
     <f:selectItems value="#{selectionLabBean.heroGroupList}" /> 
</h:selectOneMenu> 
<p:message for="SelectOneMenuGroup" /> 

जहां heroGroupList कुछ इस तरह है:

SelectItem[] heroArr = new SelectItem[] { 
    new SelectItem("Paladin"), 
    ... 
}; 
heroListWithGrouping.add(
    new SelectItemGroup("Human", 
     "A collection of human race Heroes", 
     false, 
     heroArr 
    ) 
); 
..... 

और मैं ' मैं सोच रहा हूं कि क्या मैं SelectItem ऑब्जेक्ट्स के बजाय पीओजेओ के साथ इस प्रकार के समूह को कर सकता हूं?

अगर मैं इसे प्राप्त नहीं कर पाता, तो मुझे लगता है कि मुझे किसी भी तरह से मेरी डोमेन ऑब्जेक्ट्स या मेरे क्वेरी परिणामों को चयन करने के लिए SelectItem के सरणी में परिवर्तित करना होगा।

कोई विचार?

उत्तर

9

जब आप SelectItemGroup का उपयोग करना चाहते हैं तो यह वास्तव में संभव नहीं है। बीन (पोस्ट) निर्माण के दौरान आपको दोहरे फॉर-लूप में पीओजेओ के संग्रह से List<SelectItem> में कनवर्ट करने की आवश्यकता है।

@PostConstruct 
public void init() { 
    List<HeroRace> heroRaces = getItSomehowFromDatabase(); 
    this.heroGroupList = new ArrayList<SelectItem>(); 
    for (HeroRace heroRace : heroRaces) { 
     SelectItemGroup group = new SelectItemGroup(heroRace.getName()); // Human, etc 
     List<SelectItem> heroes = new ArrayList<SelectItem>(); 
     for (Hero hero : heroRace.getHeroes()) { 
      heroes.add(new SelectItem(hero.getName()); // Paladin, etc 
     } 
     group.setSelectItems(heroes.toArray(new SelectItem[heroes.size()])); 
     this.heroGroupList.add(group); 
    } 
} 

तुम भी आइटम मूल्य के रूप में इस्तेमाल कर सकते हैं Hero

heroes.add(new SelectItem(hero, hero.getName()); // Paladin, etc 

ताकि आप String के बजाय एक Hero प्रकार के #{selectionLabBean.oneSelectMenuGroup} बाध्य कर सकते हैं। लेकिन फिर आपको Converter की आपूर्ति करने की आवश्यकता है। उस हिस्से का पहले से ही अमोर्फिस द्वारा उत्तर दिया गया है।

+0

तो, निष्कर्ष यह है: समूहबद्ध चयन का उपयोग करने के लिए, हमें POJO को सूची में परिवर्तित करना होगा। लेकिन हम अभी भी पीओजेओ का उपयोग कनवर्टर के साथ आइटम वैल्यू के रूप में कर सकते हैं। Coooool! धन्यवाद बलुससी। – bertie

+0

मैंने इसे हीरो प्रकार से बाध्य करने का प्रयास किया, लेकिन यह त्रुटि के साथ विफल रहा: SelectOneMenuGroup: प्रमाणीकरण त्रुटि: मान मान्य नहीं है, जो अजीब है, क्योंकि मैं किसी भी सत्यापन का उपयोग नहीं करता हूं। .. और प्रबंधित लाइब्रेरी में, बाध्यकारी है: निजी हीरोबीन एक चयन करेंमेनू समूहपोज़; मैंने इसे डीबग किया और प्रोजेगी को बाध्यकारी मूल्य निर्धारित नहीं किया। मैंने var = "नायक" आइटम वैल्यू = "# {नायक}" itemLabel = "# {hero.name}" की कोशिश की है, लेकिन यह भी असफल रहा। – bertie

+0

यह तब भी हो सकता है जब चयनित आइटम सूची में किसी भी आइटम को 'बराबर()' विधि से मेल नहीं खाता हो। संभावना है कि 'बराबर() 'विधि लागू नहीं की गई है या खराब कार्यान्वित नहीं किया गया है। – BalusC

4

हां, आप SelectItems के बजाय POJO की सूची या सरणी वापस कर सकते हैं। काम करने के लिए आपको कनवर्टर की आवश्यकता होगी, लेकिन यह एक बड़ा सौदा नहीं है। तो, पहला कनवर्टर:

@FacesConverter(forClass=Hero.class) 
public class HeroConverter implements Converter { 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     return new Hero(value); 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     return ((Hero)value).getName(); 
    } 
} 

अब अगर आप <f:selectItems> करने के लिए Hero तों की सूची लौटने के लिए, यदि आप HTML में विकल्प हैं जहां लेबल Hero.toString() है, और मूल्य HeroConverter.getAsString() से दिया जाता है।

एक और बात। यदि आप इस चयन के लिए कुछ मान सबमिट करते हैं, तो जेएसएफ इसे ऑब्जेक्ट में परिवर्तित करता है और चेक करता है (बराबर() विधि द्वारा) यदि यह ऑब्जेक्ट चयन के लिए ऑब्जेक्ट्स की सूची में था। तो ऊपर दिए गए मामले में, Hero में equals() को ओवरराइड करने की आवश्यकता होगी ताकि यह जांच सके कि नाम बराबर हैं या नहीं। एक और समाधान getAsObject में नया उदाहरण नहीं बनाना है, लेकिन Hero एसएस की कहीं भी सूची रखने के लिए और इस सूची को <f:selectionItems> पर वापस लौटें और getAsObject() में इस सूची से ऑब्जेक्ट लौटाएं।

+0

आपको बहुत बहुत धन्यवाद। जेएसएफ कन्वर्टर्स को समझने में यह मेरे लिए कुछ नया है और यह एक नया उदाहरण नहीं बना रहा है। आपका दिन शुभ हो ! – bertie