2009-06-27 7 views
0

Rédaction d'une application JSF simple dont j'ai rencontré les problèmes suivants: Ma classe entities.controller.EntityNameManager contient une méthode getEntityNameSelectList() que je peux utiliser pour remplir un ComboBox avec. Cela fonctionne et montre toutes les entités, puisque la méthode pour récupérer les entités n'a pas de clause where. Cette méthode a été créée automatiquement.Personnalisé getEntityNameSelectList() échoue

Maintenant je veux avoir une deuxième méthode similaire, qui filtre les options basées sur une variable dans la sessioncope. Pour ce faire, j'ai copié la méthode d'origine, l'ai renommée getEntityNameSelectListByUser (User theUser) et changé la méthode qui interroge la base de données à celle qui filtre effectivement par UserId.

Cependant, lorsque j'essaie de charger la page dans le navigateur, j'obtiens une erreur indiquant que la classe de contrôleur n'a pas de propriété "EntityNameSelectListByUser". Je suppose que puisque ma nouvelle méthode attend un paramètre, il ne peut pas être trouvé. Y a-t-il un moyen de le rendre conscient du Parameter ou de l'ID utilisateur Sessionscope?

Répondre

0

La prise en charge des paramètres dans EL est prévue pour la prochaine version de maintenance de JSR 245 (annonce here, implémentation here). En supposant que vous ne voulez pas attendre JEE6, vous avez plusieurs façons de surmonter cette limitation. Ceux-ci sont définis en termes de beans gérés POJO, donc adaptez-les à vos EJB selon les besoins.

1.

Effectuer la recherche de session et appel de fonction dans un grain de support:

public String getFoo() { 
    FacesContext context = FacesContext 
     .getCurrentInstance(); 
    ExternalContext ext = context.getExternalContext(); 
    String bar = (String) ext.getSessionMap().get("bar"); 
    return getFoo(bar); 
    } 

Exemple de liaison:

#{paramBean.foo} 

2.

Utiliser un EL function (défini dans un TLD, mappé à une méthode statique publique):

public static String getFoo(ParamBean bean, String bar) { 
    return bean.getFoo(bar); 
    } 

Exemple de liaison:

#{baz:getFoo(paramBean, bar)} 

3.

subvertir la classe de la carte pour appeler la fonction (un peu un hack et limité à un paramètre):

public Map<String, String> getFooMap() { 
    return new HashMap<String, String>() { 
     @Override 
     public String get(Object key) { 
     return getFoo((String) key); 
     } 
    }; 
    } 

Exemple de liaison:

#{paramBean.fooMap[bar]}