Comment Initialiser le Maillot de l'Application (ResourceConfig) Avec le Printemps?

Je suis en utilisant Jersey 2 et le Printemps, et je suis en train d'initialiser mon Maillot de l'application (c'est à dire la classe dérivée de ResourceConfig) avec des paramètres à partir du Printemps contexte.

Contexte: j'ai un Jersey simple application que j'ai créer (c'est à dire une GUERRE seule) et je le déployer sur un serveur de cluster avec différentes configurations de Ressort sur des serveurs différents pour activer ou désactiver les différentes parties du serveur, par exemple, certains serveurs ont /search ressources allumé, etc. C'était vraiment facile à Jersey 1.0: je viens de mettre,

<context:component-scan base-package="com.mycompany.resources.search"/>

au Printemps de config pour avoir Jersey analyse de paquet particulier et permettre à l'JAX-RS fournisseurs de ressources.

Maintenant en Jersey 2.0 le Printemps <context:component-scan ... /> ne fonctionne pas, alors que les ressources doivent être inscrits par programmation dans une startup classe dérivée de ResourceConfig:

public class MyApplication extends ResourceConfig {

    public MyApplication() {
        packages("com.mycompany.resources.search");
    }
}

C'est très bien, mais j'ai besoin de conditionnellement analyse de ce paquet, et je ne peux pas comprendre comment le faire tout de Printemps de configuration dans le MyApplication classe. Je pensais que constructeur d'injection peut fonctionner:

public class MyApplication extends ResourceConfig {

    @Autowired
    public MyApplication(@Qualifier("my-config") MyConfiguration myConfiguration) {
        if (myConfiguration.isEnabled()) {
            packages("com.mycompany.resources.search");
        }
    }
}

Cependant HK2 se plaint qu'il ne peut pas trouver un constructeur par défaut à utiliser... donc cela m'indique que le DI est en jeu dans la construction de cette classe, mais que la DI n'est pas à l'aide de Printemps.

De la même façon, en utilisant le Printemps bean cycle de vie ne fonctionne pas:

public class MyApplication extends ResourceConfig implements InitializingBean {

    @Autowired
    private MyConfiguration myConfiguration;

    public MyApplication() {
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        if (myConfiguration.isEnabled()) {
            packages("com.mycompany.resources.search");
        }
    }
}

(Le afterPropertiesSet méthode n'est pas appelée.)

Alors maintenant, je suis coincé: est-il possible de configurer un Maillot ResourceConfig objet de l'application à l'aide de Printemps?

Mise à JOUR:

J'ai accepté @JohnR la réponse ci-dessous, mais je vais aussi de mon éventuelle solution qui je pense est un peu plus propre. @JohnR réponse était d'avoir l'objet initialisé à deux reprises: d'abord par le Printemps et ensuite en Jersey/HK2. Quand le Printemps initialise l'objet de la cache de l'dépendances dans un membre statique, et puis quand Jersey/HK2 initialise plus tard, vous pouvez récupérer les dépendances.

J'ai fini par faire ceci:

public class MyApplication extends ResourceConfig {

    public MyApplication() {
        ApplicationContext rootCtx = ContextLoader.getCurrentWebApplicationContext();
        MyConfiguration myConfiguration = rootCtx.getBean(MyConfiguration.class);

        if (myConfiguration.isEnabled()) {
            packages("com.mycompany.resources.whatever");
        }
    }
}

Plutôt que d'avoir l'objet initialisé à deux reprises, nous laissons Jersey/HK2 l'initialiser, mais ensuite nous avons récupérer les dépendances à partir du Printemps.

Les deux solutions sont vulnérables à la période: ils supposent que le Printemps est initialisé avant de Jersey/HK2.

J'ai couru dans des problèmes semblables avec le Maillot 2 + Ressort. En fin de compte, j'ai fini par rouler ma propre intégration. ma réponse à cette question de l'aide?
C'est une excellente réponse. Très regrettable, que vous avez eu à rouler votre propre Jersey/Printemps pont. Malheureusement, mon expérience a été similaire: beaucoup de temps perdu avec Jersey 2 et au Printemps. Je suis maintenant bien fonctionner, mais les jersey2-printemps pont semble avoir un étroit "heureux" chemin à travers elle et de nombreux pièges, si vous vous écartez. Mon conseil à quiconque de se lancer sur le Maillot 2 et Printemps: suivre le exemple d'application et de ne pas essayer de faire quelque chose de différent, car il ne fonctionnera pas.

OriginalL'auteur Michael Iles | 2014-01-08