2009-06-27 31 views
0

Eine einfache JSF-Anwendung schreiben Ich habe einige über das folgende Problem: Meine entities.controller.EntityNameManager-Klasse enthält eine Methode getEntityNameSelectList(), mit der ich eine ComboBox mit füllen kann. Dies funktioniert und zeigt alle Entitäten an, da die Methode zum Abrufen der Entitäten keine where-Klausel hat. Diese Methode wurde automatisch erstellt.Benutzerdefiniert getEntityNameSelectList() schlägt fehl

Jetzt möchte ich eine zweite ähnliche Methode haben, die die Optionen basierend auf einer Variablen im Sessionscope filtert. Dazu kopierte ich die ursprüngliche Methode, benannte sie in getEntityNameSelectListByUser (User theUser) um und änderte die Methode, die die Datenbank abfragt, in eine, die tatsächlich nach UserId gefiltert wird.

Beim Versuch, die Seite im Browser zu laden, erhalte ich eine Fehlermeldung, dass die Controller-Klasse keine "EntityNameSelectListByUser" -Eigenschaft hat. Ich nehme an, dass meine neue Methode einen Parameter erwartet, weil sie nicht gefunden werden kann. Gibt es eine Möglichkeit, auf den Parameter oder die Sessionscope-Benutzer-ID aufmerksam zu machen?

Antwort

0

Die Unterstützung für Parameter in EL ist für die nächste Wartungsversion von JSR 245 vorgesehen (Ankündigung here; Implementierung here).


Angenommen, Sie möchten nicht auf JEE6 warten, haben Sie mehrere Möglichkeiten, diese Einschränkung zu überwinden. Diese Näherungen werden in Bezug auf POJO-verwaltete Beans definiert, passen Sie sie also Ihren EJBs entsprechend an.

1.

Sie die Session-Lookup und Funktionsaufruf in einer Backing Bean:

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

Beispiel Bindung:

#{paramBean.foo} 

2.

Verwenden Sie ein EL function (definiert in einer TLD, die einer öffentlichen statischen Methode zugeordnet ist):

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

Beispiel Bindung:

#{baz:getFoo(paramBean, bar)} 

3.

die Karte Klasse Stürzen die Funktion (ein Bit eines Hack und auf einen Parameter beschränkt) zu nennen:

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

Beispielbindung:

#{paramBean.fooMap[bar]}