2010-09-19 8 views
5

Ich benutze Jersey 1.4 ea zusammen mit Spring 3.0 und der jersey-spring Integration. Die Integration von Jersey und Spring funktioniert gut für Ressourcenklassen wie beschrieben here. Wie auch immer, ich möchte eine Federkomponente in eine ContainerRequestFilter injizieren, um einige Vorverarbeitungen von Anfragen zu machen.Jersey: Injection Spring Komponente in ContainerRequestFilter

@Component 
public class SecurityFilter implements ContainerRequestFilter { 

    // UserManager is a declared spring component 
    // Injecting it should work somehow 
    @Autowired 
    private UserManager userManager; 

    @Override 
    public ContainerRequest filter(ContainerRequest request) { 
     System.out.println(userManager); 
     // prints out null on request 
    } 
} 

Sowohl der Filter als auch die User-Manager-Bean werden registriert, wenn ich die Anwendung an Glassfish veröffentliche. Ich frage mich, was ich falsch mache. Gibt es eine Möglichkeit, eine federverwaltete Bean in einen ContainerRequestFilter zu injizieren?

UPDATE

Art gelöst. Das Problem besteht darin, dass Jersey keine Spring-Beans erhält, wenn diese Beans Java-Proxies sind (im Gegensatz zu generierten Proxy-Klassen). Das Problem kann gelöst werden, indem Spring angewiesen wird, IMMER Proxy-Klassen anstelle von Java-Proxys zu verwenden, indem das Attribut proxy-target-class="true" in den entsprechenden Teilen einer Federkonfiguration angegeben wird. In meinem Szenario musste ich es auf <tx:annotation-driven proxy-target-class="true" /> angeben.

Eine detailliertere Analyse und eine mögliche Fehlerbehebung finden Sie unter here.

+0

In Ihrer Lösung, wie dieser SecurityFilter in der Datei web.xml oder woanders registriert wurde? Ich habe ein Problem hier https://stackoverflow.com/q/45509183/4636715, in dem der ContainerRequestFilter überhaupt nicht besucht wird. – vahdet

Antwort

2

Ich sehe das gleiche mit Jersey 1.6 und Frühling 3.0.5. Mit Hilfe des Debuggers, das kann ich sagen, auch wenn mein Code mit @Component markiert ist, werden beide Frühling und Jersey instanziiert ihre eigene Kopie dieser Klasse:

@Path("/beams") 
@Produces("text/xml") 
@Component 
@Scope("singleton") 
public class BeamsResource { 
} 

Es gibt einige Chatter, dass dies in einer Zukunft hinzugefügt werden Version von Jersey, aber es scheint jetzt nicht zu funktionieren. Ich weiß, dass dies eine abscheuliche Lösung ist, aber ich benutze eine statische Elementvariable, um Jersey und Spring vorerst zusammen zu bringen. Bläh.

+1

Ich bin endlich auf eine Lösung dafür gestoßen. Beim Debugging des Codes stellte sich heraus, dass es ein Problem ist, wie Jersey Spring Beans aus dem Kontext bezieht. Meine Gedanken sind dokumentiert http://jersey.576304.n2.nabble.com/AW-Jersey-ContainerRequestFilter-as-Spring-component-td5724265.html – nre

+0

Siehe auch das Update zu meiner Frage. – nre

Verwandte Themen