2010-12-29 19 views
7

böyle bir şey ile gruplandırılmış seçimleriyle çalışmaya denedim:MTU 2: Seçim SelectItemGroup + POJO ile gruplama

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

heroGroupList böyle bir şeydir:

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

Ve i' m SelectItem nesneleri yerine POJOs ile bu tür gruplama yapabilir miyim merak mı?

Bunu başaramazsam, bir şekilde etki alanı nesneleri veya sorgu sonuçlarımın çalışmasını sağlamak için SelectItem dizilerine dönüştürmem gerektiğini düşünüyorum.

Herhangi bir fikrin var mı?

cevap

9

Bu, SelectItemGroup'u kullanmak istediğinizde gerçekten mümkün değildir. Fason (post) yapımı sırasında POJO'ların toplanmasından List<SelectItem>'a çift döngüde dönüştürmeniz gerekir.

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

Ayrıca yerine String bir Hero tipine #{selectionLabBean.oneSelectMenuGroup} bağlayabilmesiyle

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

böylece madde değeri olarak Hero kullanabilirsiniz. Ancak o zaman bir Converter sağlamanız gerekir. Bu bölüm zaten Amorfis tarafından cevaplandı.

+0

Sonuç olarak, gruplandırılmış seçimi kullanmak için POJO'yu List 'a dönüştürmeliyiz. Ancak POJO'yu dönüştürücü ile itemValue olarak kullanabiliriz. Coooool! Teşekkür ederim BalusC. – bertie

+0

Bunu Hero türüne bağlamayı denedim, ancak hatayla başarısız oldu: SelectOneMenuGroup: Doğrulama Hatası: Değer geçerli değil, bu da garip, çünkü hiç bir doğrulama kullanmıyorum. .. Ve yönetilen ağda, bağlayıcı: özel HeroBean oneSelectMenuGroupPojo; Hata ayıkladı ve proggie'nin ciltleme değerini ayarlamadığını öğrendim. Var = "hero" itemValue = "# {hero}" itemLabel = "# {hero.name}" denedim, ancak başarısız oldu. – bertie

+0

Seçilen öğe, listedeki öğelerden herhangi birine eşleşmediğinde bu, 'equals() yöntemiyle gerçekleşebilir. Muhtemelen 'equals()' yöntemi uygulanmadı veya zayıf uygulandı. – BalusC

4

Evet, List'i veya SelectItems yerine POJO'ların dizisini döndürebilirsiniz. Bunun çalışması için dönüştürücüye ihtiyacınız olacak, ancak büyük bir sorun değil. Yani, ilk dönüştürücü: <f:selectItems> için Hero es listesini dönerseniz etiket Hero.toString() olan ve bu değeri HeroConverter.getAsString() döndü nerede

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

Şimdi, HTML seçenekler vardır.

Bir şey daha. Bu seçim için bir değer gönderirseniz, JSF nesneyi nesneye dönüştürür ve bu nesne seçim nesnesi listesinde ise (equals() yöntemiyle) denetler. Bu durumda, adların eşit olup olmadığını kontrol etmek için Hero numaralı telefondan equals()'u geçersiz kılmanız gerekir. Başka bir çözüm, getAsObject'da yeni örnek oluşturmak değil, mevcut Hero eslerin bir listesini tutmak ve bu listeyi <f:selectionItems>'a döndürmek ve bu listeden nesneyi getAsObject() içinde döndürmektir.

+0

Çok teşekkür ederim. Bu, yeni bir örnek oluşturmamaya eşittir ve JSF dönüştürücülerinin anlaşılmasında benim için yeni bir şeydir. İyi günler ! – bertie