Ссылки OSGi Service не работают с инжектором конструктора

У меня есть пакет (A), который экспортирует менеджер транзакций Hibernate в качестве службы OSGi, с интерфейсом службы PlatformTransactionManager,

В другом пакете (B) я определяю ссылку на этот сервис OSGi. Пакет B определяет бин, ReservationDao, что берет PlatformTransactionManager в качестве параметра конструктора. Конструктор отмечен @Autowired,

Когда загружается контекст приложения, иногда (часто) выдается следующая ошибка:

Unsatisfied dependency expressed through constructor argument with index 1 of type [org.springframework.transaction.PlatformTransactionManager]: : No matching bean of type [org.springframework.transaction.PlatformTransactionManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.springframework.transaction.PlatformTransactionManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:513)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:92)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284)
... 20 more

По сути, автоматическое подключение завершается неудачно, потому что нет доступного компонента, который является PlatformTransactionManager, Та же самая ошибка возникает при инжекции поля.

Если я создаю методы установки и отмечаю их @Autowire, контекст приложения загружается правильно.

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

1 ответ

Возможно, вам понадобится добавить это в ваш beans.xml:

<context:annotation-config/>

Альтернативу вам может понадобиться использовать:

@Autowired
public yourconstructor(@Qualifier("platformTransactionManager")  PlatformTransactionManager ptm)
Другие вопросы по тегам