2010-09-19 16 views
5

J'utilise Jersey 1.4 ea avec Spring 3.0 et l'intégration jersey-spring. L'intégration de Jersey et Spring fonctionne correctement pour les classes de ressources, comme décrit here. Comment jamais je veux injecter un composant de ressort dans un ContainerRequestFilter pour faire un pré-traitement des demandes.Jersey: Injecter le composant Spring dans 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 
    } 
} 

Le filtre et le bean du gestionnaire d'utilisateurs sont enregistrés lorsque je déploie l'application sur Glassfish. Je me demande ce que je fais mal. Existe-t-il un moyen d'injecter un bean géré par ressort dans un ContainerRequestFilter?

UPDATE

Type de résoudre. Le problème est que Jersey n'obtient pas de beans Spring si ces beans sont des proxies Java (par opposition aux classes proxy générées). Le problème peut être résolu en demandant à Spring d'utiliser TOUJOURS les classes de proxy au lieu de Java Proxies en spécifiant l'attribut proxy-target-class="true" dans les parties respectives d'une configuration de ressort. Dans mon scénario, je devais le spécifier sur un <tx:annotation-driven proxy-target-class="true" />. Pour une analyse plus détaillée et une solution possible, voir here.

+0

Dans votre solution, comment SecurityFilter a été enregistré dans le fichier web.xml ou ailleurs? J'ai un problème ici https://stackoverflow.com/q/45509183/4636715 dans lequel le ContainerRequestFilter n'est pas visité du tout. – vahdet

Répondre

2

Je vois la même chose avec Jersey 1.6 et Spring 3.0.5. En utilisant le débogueur, je peux dire que même si mon code est marqué par @component, au printemps et à Jersey instanciera leur propre copie de cette classe:

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

Il y a quelques bavardages que cela sera ajouté dans un avenir version de Jersey, mais il ne semble pas fonctionner maintenant. Je sais que c'est une solution hideuse, mais j'utilise une variable membre statique pour relier Jersey et Spring pour le moment. Bleh.

+1

J'ai finalement trouvé une solution pour cela. Débogage du code, il s'est avéré que c'est un problème dans la façon dont Jersey obtient les beans Spring à partir du contexte. Mes pensées sont documentées http://jersey.576304.n2.nabble.com/AW-Jersey-ContainerRequestFilter-as-Spring-component-td5724265.html – nre

+0

Voir aussi la mise à jour sur ma question. – nre