JSF: h:selectOneMenu produziert mehrfachen Methodenaufruf

DerGrinsemann

Mitglied
Hallo!

Folgende Codeschnippsel:

Code:
public enum Country {

    AUT,    // Österreich
    DEU,    // Deutschland
    CHE     // Schweiz
            
}

Code:
@Stateful
@Name("geoUnitListHandler")
@Scope(ScopeType.CONVERSATION)
public class GeoUnitListHandler implements GeoUnitListHandlerLocal, Serializable {
...
public Country[] getCountryArray() {
        System.out.println("CountryArray");
        return Country.values();
    }
...

Code:
<h:form>
            <h:selectOneMenu value="#{geoUnitListHandler.selectedCountry}" required="false">
                <s:selectItems value="#{geoUnitListHandler.countryArray}" var="_country" label="#{messages['country.'.concat(_country)]}"
                               noSelectionLabel="Select a Country..."/>
                <s:convertEnum/>
            </h:selectOneMenu>
</h:form>

produziert im System.out

Code:
CountryArray
CountryArray
CountryArray

Ich weiss das "System.out.println" nicht die feine Art ist - konnte es nur nicht glauben. Warum wird die Methode dreimal aufgerufen?

Was läuft falsch?

Marco

Ergänzung: Auch bei der Erweiterung von Country um einen 4. Wert (z.B. ITA) erfolgt ein dreifacher Aufruf.
 
Zuletzt bearbeitet:
Hallo,

... Was läuft falsch? ...

ich behaupte jetzt mal nichts. Wobei ich nicht hundertprozentig sagen kann, wie Seam das intern macht - s:selectItems ist ja ein Seam-Tag. Beim "normalen" JSF, also der RI, ruft das Renderkit, die UISelectItems.getValue()-Methode zweimal auf - einmal zur Bestimmung der Größe der Select-Liste und einmal zum Rendern der einzelnen Options. Das ganze geschieht in der RenderResponse-Phase.

Seam scheint das ganze nochmal aufzurufen. Ich vermute mal, beim Zusammenbau seiner eigenen SelectItems, da in deiner Variante die ursprüngliche Liste ja noch um einen weiteren Wert, den noSelection, erweitert wird.

Grüße
THMD
 
Zurück