1

Spring-DM と @Autowired で Osgi サービスの問題に直面しています。Spring Bean + OSGI サービスを次のように定義しました。

<bean id="my.sessionFactoryBean"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource">
            <ref local="my.dataSource" />
        </property>
            ...
</bean>
<osgi:service ref="my.sessionFactoryBean"
                id="my.sessionFactory" interface="org.hibernate.SessionFactory" />

別のバンドルから、次のような xml Bean 定義で問題なくこのサービスを参照できます。

<beans>
...
    <osgi:reference id="my.sessionFactory"
        interface="org.hibernate.SessionFactory" />
..
    <bean id="my.databaseItemReader"
        class="my.MyReader">
        <property name="sessionFactory" ref="my.sessionFactory" />
...
</beans>

私の問題は、次のような @Autowired 注釈の使用に依存しています。

public abstract class AbstractHibernateDao {

    @Autowired
    @Qualifier(value="my.sessionFactory")
    private SessionFactory sessionFactory;
    ...

古典的なエラーが発生しています:

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.Sess
ionFactory my.AbstractHibernateDao.sessionFactory; nested exception is org.springfr
amework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.hibernate.SessionFactory] found for d
ependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {
@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qu
alifier(value=my.sessionFactory)}

@Qualifier を削除すると、次のエラーが発生します。

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [org.hibernate.SessionFactory] is defined: expected single matching bean but found 2: [my.sessionFactoryBean, my.sessionFactory]

これにより、Spring Bean レジストリに OSGI サービスがあると思います...何が間違っているのでしょうか?

参考までに、セッターで @ServiceReference を使用して OSGI サービスを注入しようとしましたが、Spring-DM はそれを注入しません (いくつかの nullpointerexception があります)。

4

1 に答える 1

0

推測ですが、@Autowire を使用する場合は、「context:component-scan」を実行する必要があり、これにより、表示される追加の Bean (my.sessionFactoryBean) が検出される可能性があります。XML を使用して挿入した場合、コンポーネント スキャンが有効になっていない可能性があるため、OSGi サービスは適切に解決されています。

于 2012-12-05T22:49:03.840 に答える