Ссылки 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)