2012-04-08 1 views
0

Ich benutze JSF 2 und EJB 3.1, alle von ihnen sind auf Glassfish 3.1 bereitgestellt.So rufen Sie EJB in PhaseListener

Wenn ich eine Klasse namens MyInterceptor, die PhaseListener implementiert ist, einrichten, kann ich nicht Remote-EJB-Schnittstelle in ihm widerrufen.

Es bemerken "Nullpointer ..."

public class MyInterceptor implements PhaseListener { 

@EJB(name="AuthorizationEJB", 
      beanInterface=AuthorizationService.class, 
      mappedName="corbaname:iiop:localhost:3700#ejb/AuthorizationEJB") 
public AuthorizationService authorizationService; 

.... 

} 

Wenn ich rufe authorizationService.dosomestuff(), es Fehler Nullpointer

erhöhen Wie kann ich es beheben könnte tun?

Vielen Dank im Voraus

+0

i-by-Call meine Lösung, die eine Managed Bean das hat es mit der EJB aufrufen können. Vielen Dank für Ihre Hilfe. – user1127139

Antwort

3

In JSF 2.1 und früher PhaseListeners sind leider keine Injektion Ziele (das heißt, Sie nicht Injektion in Anspruch genommen werden können). Sie können Ihre Suche jedoch programmgesteuert über JNDI durchführen.

In JSF 2.2 werden alle JSF-Artefakte (einschließlich PhaseListeners) Injektionsziele sein, aber das wird Ihnen wahrscheinlich jetzt nicht helfen.

Nicht verwandt mit Ihrer Frage, aber ich bin mir nicht sicher, was Sie erreichen möchten, indem Sie die beanInterface in Ihrer Anmerkung angeben. Höchstwahrscheinlich benötigen Sie auch nicht das Attribut name und wenn Ihre Bean eine lokale Bean ist, brauchen Sie auch nicht mappedName.

2

Verwenden Sie einen servlet filter anstelle eines JSF-Phasen-Listeners, um die Autorisierung durchzuführen. Sie können eine @EJB in eine @WebFilter injizieren.

0

Yeah in Web-Filter könnten Sie gerade @EJB verwendet haben. Maximimum, das Sie BeanName hinzufügen mussten, wenn Sie zwei Beans haben, implementieren Sie AuthorizationService Schnittstelle.

Servlet-Filter ist pro Anfrage, ich glaube nicht, dass Sie Sicherheits-Features in einer bestimmten Phase aus dem Lebenszyklus von JSF tun müssen (das ist eine detailliertere Ebene als die gesamte HTTP-Anfrage).

Für normale Lookup können Sie tun:

AuthorizationService.class.cast(new InitialContext().lookup("corbaname:iiop:localhost:3700#ejb/AuthorizationEJB")).dosomestuff(); 

in einem Try-Catch javax.naming.NamingException