2010-11-30 6 views
3

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

Так как обходной путь я реализовал BundleContextAware, чтобы получить ссылку на опубликованный контекст и получить доступ к этим компонентам. Это работает нормально, однако единственным компонентом контекста является warDeployer (следует упомянуть, что я использую Spring-удлинитель весны dm для развертывания войны). Пакет, присутствующий в контексте, - это мой пакет, поэтому я не могу понять, почему контекст, который я получаю, не имеет ни одного из моих компонентов. Код, который должен получить контекст приложения:

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

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

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

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

Barry

ответ

1

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

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

+0

Привет, спасибо, что ответите. Я думаю, что это, возможно, ошибка, поскольку я не видел никакой документации, чтобы предположить, что это не должно работать. В марте этого года была зарегистрирована джира (https://jira.springframework.org/browse/OSGI-804), но ничего против этого не было. Я столкнулся с проблемой, используя интерфейс BeanFactoryAware, который работает нормально. Спасибо – 2010-12-03 10:42:27

Смежные вопросы