2010-12-29 5 views
7

Próbowałem pracować z zgrupowanych pozycje z mniej więcej tak:JSF 2: Wybór grupowania z SelectItemGroup + POJO

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

gdzie heroGroupList jest mniej więcej tak:

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

a ja m lewo zastanawiasz się, czy mogę zrobić tego rodzaju grupowania z POJO zamiast obiektów SelectItem?

Jeśli nie mogłem tego osiągnąć, myślę, że muszę jakoś przekonwertować moje obiekty domeny lub wyniki moich zapytań na tablice SelectItem, aby działało.

Wszelkie pomysły?

Odpowiedz

9

To naprawdę niemożliwe, jeśli chcesz użyć SelectItemGroup. Konwertuj z kolekcji POJO na List<SelectItem> w podwójnej pętli for podczas budowy komponentu bean (post).

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

Można również użyć Hero jako wartość przedmiotu

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

dzięki czemu można wiązać #{selectionLabBean.oneSelectMenuGroup} do Hero typu zamiast String. Ale musisz dostarczyć Converter. Ta część została już odebrana przez Amorfis.

+0

Wniosek jest taki: aby użyć grupowego wyboru, musimy zamienić POJO na listę . Ale nadal możemy używać POJO jako itemValue z konwerterem. Coooool! Dziękuję BalusC. – bertie

+0

Próbowałem powiązać go z typem Hero, ale nie udało się z błędem: SelectOneMenuGroup: Błąd sprawdzania poprawności: Wartość jest niepoprawna, co jest dziwne, ponieważ nie używam żadnego sprawdzania poprawności. .. A w managebean powiązanie to: private HeroBean oneSelectMenuGroupPojo; Rozwinąłem go i odkryłem, że proggie nie ustawia wartości wiązania. Próbowałem var = "hero" itemValue = "# {hero}" itemLabel = "# {hero.name}", ale także nie udało się. – bertie

+0

Może się to zdarzyć, gdy wybrany element nie pasuje do żadnej z pozycji na liście według metody 'equals()'. Prawdopodobnie metoda 'equals()' nie jest zaimplementowana lub źle zaimplementowana. – BalusC

4

Tak, możesz zwrócić listę lub tablicę POJO zamiast SelectItems. Potrzebujesz do tego konwertera, ale to nie jest wielka sprawa. Tak, pierwszy przetwornik:

@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(); 
    } 
} 

Teraz, jeśli listę Hero es powrócić do <f:selectItems>, masz opcje w HTML, gdzie etykieta jest Hero.toString(), a wartość jest zwracana z HeroConverter.getAsString().

Jeszcze jedno. Jeśli podasz jakąś wartość dla tego wyboru, JSF konwertuje ją do obiektu i sprawdza (metodą equals()), jeśli ten obiekt był na liście obiektów do wyboru. W powyższym przypadku musisz zastąpić equals() w Hero, aby sprawdzić, czy nazwy są takie same. Innym rozwiązaniem nie jest utworzenie nowej instancji w getAsObject, ale utrzymanie gdzieś listy dostępnych Hero es i zwrócenie tej listy do <f:selectionItems> i zwrócenie obiektu z tej listy w getAsObject().

+0

Dziękuję bardzo. To jest coś, a nie tworzenie nowej instancji jest dla mnie czymś nowym w zrozumieniu konwerterów JSF. Miłego dnia ! – bertie