2013-07-30 5 views
5

Ich entwickle eine REST-Anwendung mit Glassfish 4.0.GlassFish 4 + JAX-RS Filter mit @EJB

In den Ressourcenklassen kann ich die Injektion zur Arbeit bringen, indem ich die Klasse @Stateless und die Injektion über @EJB mache (die injizierte Klasse ist eine zustandslose EJB).

Dieser Ansatz funktioniert jedoch nicht in einem JAX-RS-Filter. Ich kann keine Injektion bekommen, um überhaupt zu arbeiten.

Siehe Code unten:

@Provider 
public class UpdateFilter implements ContainerRequestFilter { 

    @EJB 
    private MyBeanInterface doStuffBean; 

    @Override 
    public void filter(ContainerRequestContext requestContext) { 

     ... 
    } 
} 

doStuffBean ist immer null.

Irgendwelche Vorschläge?

Antwort

1

Ich glaube, das @ EJB funktioniert nur in Java EE verwalteten Klassen wie andere EJBs und Servlets.

Wenn Sie CDI verwenden, können Sie stattdessen Annotation @Inject verwenden, aber wenn diese Klasse keine ManagedBean ist, müssen Sie eine Suche durchführen.

+0

@Inject funktioniert nicht. Eine Ausnahme wird ausgelöst: ** UnbefriedigteDependenz-Ausnahme: Es war kein Objekt für die Injektion verfügbar ... **. – bafitor

+0

Das ist, weil Ihre Klasse keine verwaltete Bean ist. Ich bin mir nicht sicher, ob Sie diesen Provider zu ManagedBean machen können, also werden Sie wahrscheinlich Ihren eigenen Producer erstellen müssen, der die EJB-Suche durchführt und dann können Sie überall injizieren (es gibt viele Artikel, die Ihnen zeigen, wie Sie dies tun) oder Sie kann nur die Suche in dieser Klasse tun. – ZeusSelerim

0

Versuchen Sie, CDI zu verwenden, indem Sie @Stateless durch @ManagedBean und @EJB durch @Inject ersetzen. Das funktioniert bei mir in JAX-RS.

Wenn Sie EJB für andere Dinge als die Injektion benötigen, kann es für Sie funktionieren, die doppelte Anmerkung @Stateless @ManagedBean zu behalten.

+0

Ich habe beide Lösungen ausprobiert, aber es funktioniert nicht. Ich habe eine ** Unbefriedigte AbhängigkeitException: Es war kein Objekt zur Injektion verfügbar. **. Irgendeine Idee? – bafitor

+1

Ich habe das vorher nicht mit GF3 gesehen, also wahrscheinlich ein Problem in GF4. https://java.net/jira/browse/GLASSFISH-20597 sagt, es ist in v4.0.1 behoben - ist das die Version, die Sie verwenden? Wenn nicht, können Sie einige der Umgehungsvorschläge unter http://stackoverflow.com/questions/16216759/dependency-injection-with-jersey-2-0 ausprobieren. Haben Sie versucht, @Stateless zu entfernen, oder benötigen Sie sie? – TheArchitect