Доступ к контексту приложения из класса BundleContextAware - PullRequest
3 голосов
/ 30 ноября 2010

Я создал связку осги из уже существующей войны.В приложении есть класс, который реализует весенний интерфейс ApplicationContextAware, затем он использует контекст для программного получения бинов (не знаю почему, но в конечном итоге это требует рефакторинга).Теперь приложение использует OsgiBundleXmlApplicationContext, но я полагаю, что при использовании этого метода существует проблема, из-за которой метод setApplicationContext не вызывается ни в каких классах, реализующих ApplicationContextAware, поэтому теперь контекст в этом классе всегда равен нулю.

В качестве обходного пути я реализовал BundleContextAware, чтобы я мог получить ссылку на опубликованный контекст и таким образом получить доступ к bean-компонентам.Это работает нормально, однако единственным компонентом в контексте является warDeployer (следует упомянуть, что я использую spring dm bundle spring-extender для развертывания войны).Пакет, представленный в контексте, является моим пакетом, поэтому я не понимаю, почему в контексте, который я получаю, нет ни одного из моих компонентов.Код, который я должен получить для контекста приложения: </p> <p>ServiceReference ref = bundleContext.getServiceReference(ApplicationContext.class.getName()); applicationContext = (OsgiBundleXmlApplicationContext) bundleContext.getService(ref);

Я вижу в журналах, что большая часть моего контекста создается, поэтому я не могу понять, почему они не соответствуют контексту, который я получаю,

Может кто-нибудь посоветовать, что не так?Я понимаю, что этот подход немного хакерский, но он временный, пока не реорганизован существующий код.

Заранее спасибо.

Барри

1 Ответ

1 голос
/ 03 декабря 2010

Я считаю, что служба ApplicationContext регистрируется асинхронно расширителем Spring-DM.Таким образом, у вас, вероятно, есть состояние гонки, т.е. вы запрашиваете услугу непосредственно перед ее фактической регистрацией.

Вы можете ввести задержку, но тогда вы очень глубоко проникнете в область мерзкого хака.Было бы лучше выяснить, почему метод setApplicationContext для компонентов ApplicationContextAware не устанавливается.Вы должны попытаться поднять эту ошибку в Spring-DM или задать вопрос в группе Google Spring-DM.

...