2011-06-27 3 views
3

Passing a Enum value as a parameter from JSFPassant une valeur Enum comme paramètre de JSF (revisité)

Cette question traite déjà cette question, mais la solution proposée n'a pas fonctionné pour moi. Je définis l'énumération suivante dans mon backing bean:

public enum QueryScope { 
    SUBMITTED("Submitted by me"), ASSIGNED("Assigned to me"), ALL("All items"); 

    private final String description; 

    public String getDescription() { 
    return description; 
    } 

    QueryScope(String description) { 
    this.description = description; 
    } 
} 

Puis-je utiliser comme un paramètre de méthode

public void test(QueryScope scope) { 
    // do something 
} 

et de l'utiliser via EL dans ma page JSF

<h:commandButton 
     id  = "commandButton_test" 
     value  = "Testing enumerations" 
     action = "#{backingBean.test('SUBMITTED')}" /> 

Jusqu'à présent si bon - identique au problème posé dans la question originale. Cependant, je dois faire face à un javax.servlet.ServletException: Method not found: %fully_qualified_package_name%.BackingBean.test(java.lang.String).

Il semble donc que JSF interprète l'appel de la méthode comme si je voulais appeler une méthode avec String comme type de paramètre (qui n'existe bien sûr pas) - donc aucune conversion implicite n'a lieu.

Quel pourrait être le facteur qui rend le comportement différent dans cet exemple de ce qui précède?

+0

Est-ce que backingbean a une instance de QueryScope? Je ne peux pas voir votre classe de backingbean entière mais je pourrais imaginer que ce serait une raison jsf n'enregistre pas l'enum – youri

+0

La définition 'enum' fait partie de la classe' BackingBean'. Il n'a lui-même aucune instance de 'QueryScope' en tant que membre. –

Répondre

5

Dans votre backingBean, vous pouvez avoir écrit une méthode avec le paramètre enum:

<!-- This won't work, EL doesn't support Enum: --> 
<h:commandButton ... action="#{backingBean.test(QueryScope.SUBMITTED)}" /> 

// backingBean: 
public void test(QueryScope queryScope) { 
    // your impl 
} 

Mais, le proposed solution n'utilise pas ENUM, il utilise String. En effet, EL ne prend pas en charge du tout:

<!-- This will work, EL does support String: --> 
<h:commandButton ... action="#{backingBean.test('SUBMITTED')}" />  

// backingBean: 
public void test(String queryScopeString) { 
    QueryScope queryScope = QueryScope.valueOf(queryScopeString); 
    // your impl 
}