2015-04-07 9 views
5

Ich benutze RestEasy in einer JBoss AS 7.1.1-Umgebung.EJB ist Null in PreProcessInterceptor

Ich habe aus Sicherheitsgründen eine PreProcessInterceptor-Klasse implementiert. Die Klasse ist mit @Provider und @ServerInterceptor versehen. Der Interceptor wird jedes Mal aufgerufen, was in Ordnung ist.

Nun, was mich stört, ist die folgende.

spritze ich ein EJB mit der @EJB Annotation in die Klasse. Wenn der PreProcessInterceptor aufgerufen wird, ist dieser EJB immer null.

@Provider 
@ServerInterceptor 
public class SecurityInterceptor implements PreProcessInterceptor 
{ 
    @EJB 
    private SomeEjb someEjbServiceFacade; 

    ... some funny stuff 
} 

Das EJB sieht aus wie folgt:

@Stateless 
public class SomeEjb extends AbstractServiceFacade 
{ 
    ... some important stuff 
} 

Der lustige Teil, es funktioniert über Lookup:

Context ctx = new InitialContext(); 
SomeEjb asf = (SomeEjb)ctx.lookup("java:global/mySuperApplication/SomeEjb"); 

Hat jemand eine Erklärung für dieses Verhalten hat?

Vielen Dank im Voraus.

+0

Haben Sie '@ Inject' probiert? – kolossus

Antwort

0

Versuchen Hinzufügen @Stateless Anmerkung zu Ihrem SecurityInterceptor Klasse.

0

Was sind Abfangjäger?

Interceptors werden in Verbindung mit Java EE-Klassen verwaltet es Entwicklern erlauben Interceptor Methoden auf einem associated target class in Verbindung mit method invocations or lifecycle events aufrufen.

Die unten Klasse SomeEjb sollte auch durch die associated target class i.e., SecurityInterceptor zugänglich sein.

@Stateless 
public class SomeEjb extends AbstractServiceFacade 
{ 
    ... some important stuff 
} 

In Ordnung zu tun, dass wir die SecurityInterceptor im <context-param> von web.xml hinzufügen müssen.

Es sollte in etwa so aussehen!

<context-param> 
     <param-name>resteasy.providers</param-name> 
     <param-value> 
     .... 
     com.myInterceptors.interceptors.security.SecurityInterceptor 
     </param-value> 
</context-param> 
+0

Wenn Sie CDI verwenden, können Sie auch die Annotation "@Observer" verwenden. [Verweise] (http://docs.oracle.com/javaee/6/tutorial/doc/gkhic.html) – 09Q71AO534

3

Sie können nicht EJB in beliebiger Klasse injizieren, aber nur in bestimmtem Typ wie Servlets, Filter, Listener, Stateless, Statefull, MessageDriven Bohnen, Singleton. Wenn Sie EJB in anderen Klassen verwenden möchten, verwenden Sie den Zugriff über JNDI, wie Sie oben gezeigt haben.