2010-11-30 37 views
3

J'ai créé un ensemble osgi à partir d'une guerre héritée existante. L'application a une classe qui implémente l'interface printemps ApplicationContextAware, elle utilise ensuite le contexte pour obtenir des beans par programmation (je ne sais pas pourquoi mais cela nécessite un refactoring). L'application utilise maintenant OsgiBundleXmlApplicationContext, mais je crois qu'il y a un problème avec l'utilisation de cette méthode par laquelle la méthode setApplicationContext n'est pas appelée dans les classes implémentant ApplicationContextAware, donc maintenant le contexte dans cette classe est toujours nul. Pour résoudre ce problème, j'ai implémenté BundleContextAware afin que je puisse obtenir une référence au contexte publié et avoir accès aux beans de cette façon. Cela fonctionne bien mais le seul bean sur le contexte est warDeployer (devrait mentionner que j'utilise le spring dm bundle spring-extender pour déployer la guerre). Le paquet présent sur le contexte est mon paquet, donc je ne peux pas voir pourquoi le contexte que je reçois n'a aucun de mes haricots là-dessus. Le code que je dois obtenir le contexte d'application est: Accéder au contexte de l'application à partir de la classe BundleContextAware

ServiceReference ref = bundleContext.getServiceReference(ApplicationContext.class.getName()); applicationContext = (OsgiBundleXmlApplicationContext) bundleContext.getService(ref);

Je peux voir dans les journaux qu'une grande partie de mon contexte devient donc je peux créés ne vois pas pourquoi ils ne sont pas sur le contexte que je reçois.

Quelqu'un peut-il conseiller sur ce qui ne va pas? Je comprends que cette approche est un peu hacker, mais c'est temporaire jusqu'à ce que le code existant soit refactorisé.

Merci d'avance.

Barry

Répondre

1

Je crois que le service ApplicationContext est enregistré de manière asynchrone l'extension Spring-DM. Vous avez donc probablement une condition de concurrence, c'est-à-dire que vous demandez le service juste avant son enregistrement.

Vous pourriez introduire un délai, mais alors vous êtes très profondément dans le territoire de piratage méchant. Il serait préférable de déterminer pourquoi la méthode setApplicationContext sur les beans ApplicationContextAware n'est pas définie. Vous devriez essayer d'élever ceci est un bogue contre Spring-DM ou demander dans le groupe de Google de DM de Printemps.

+0

Salut, merci pour la réponse. Je pense que c'est peut-être un bug car je n'ai vu aucune documentation suggérant que cela ne devrait pas fonctionner. Il y avait un jira connecté en mars de cette année (https://jira.springframework.org/browse/OSGI-804) mais rien n'a marché contre. J'ai contourné le problème en utilisant l'interface BeanFactoryAware à la place qui fonctionne bien. Merci –

+0

@ user521065 .. Dans le cas où vous obtenez ce message, pouvez-vous nous fournir quelques conseils sur la façon dont vous résoudre ce problème en utilisant l'interface BeanFactoryAware? J'ai remplacé ApplicationContextAware avec BeanFactoryAware, mais le ressort n'est toujours pas en mesure de définir l'usine, ce qui entraîne une valeur nulle. – Shamik