2010-09-19 13 views
5

Sto utilizzando Jersey 1.4 EA insieme a Spring 3.0 e l'integrazione jersey-spring. L'integrazione di Jersey e Spring funziona bene per le classi di risorse come descritto in here. Come mai voglio iniettare un componente a molla in un ContainerRequestFilter per fare un po 'di pre-elaborazione delle richieste.Jersey: Inject Spring component into 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 
    } 
} 

Sia il filtro e il manager di fagioli utente sono registrati quando ho implementare l'applicazione su Glassfish. Mi chiedo cosa sto sbagliando. C'è un modo per iniettare un bean gestito a primavera in un ContainerRequestFilter?

UPDATE

Tipo di risolto. Il problema è che Jersey non ottiene i bean Spring se questi bean sono proxy Java (opposti alle classi proxy generate). Il problema può essere risolto istruendo Spring a SEMPRE utilizzare le classi proxy anziché i proxy Java specificando l'attributo proxy-target-class="true" nelle rispettive parti di una configurazione a molla. Nel mio scenario ho dovuto specificarlo su un <tx:annotation-driven proxy-target-class="true" />.

Vedere here per un'analisi più dettagliata e una possibile correzione su quello.

+0

Nella vostra soluzione, in che modo SecurityFilter è stato registrato nel file web.xml o da qualche altra parte? Ho un problema qui https://stackoverflow.com/q/45509183/4636715 in cui ContainerRequestFilter non viene visitato affatto. – vahdet

risposta

2

Sto vedendo la stessa cosa con Jersey 1.6 e Spring 3.0.5. Utilizzando il debugger, posso dire che, anche se il mio codice è contrassegnato con @Component, sia primavera e Jersey vi istanziare la propria copia di di questa classe:

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

C'è una certa vibrazione che questo verrà aggiunto in un futuro versione di Jersey, ma non sembra funzionare ora. So che questa è una soluzione orribile, ma sto usando una variabile membro statica per agganciare Jersey e Spring per il momento. Bleh.

+1

Alla fine ho trovato una soluzione per questo. Effettuando il debug del codice, si è scoperto che è un problema nel modo in cui Jersey ottiene i fagioli Spring dal contesto. I miei pensieri sono documentati http://jersey.576304.n2.nabble.com/AW-Jersey-ContainerRequestFilter-as-Spring-component-td5724265.html – nre

+0

Vedi anche l'aggiornamento sulla mia domanda. – nre

Problemi correlati