0

springとmybatisを統合すると、次のようなエラー出力が発生しました。

'sqlSessionFactory'という名前のBeanは、タイプ[org.mybatis.spring.SqlSessionFactoryBean]である必要がありますが、実際にはタイプ[org.apache.ibatis.session.defaults.DefaultSqlSessionFactory]でした。

これが私のコードスニペットです:

ApplicationContext context = new ClassPathXmlApplicationContext("spring_mybatis_integration/spring_config.xml");
    SqlSessionFactoryBean sqlSessionFactoryBean = context.getBean("sqlSessionFactory", org.mybatis.spring.SqlSessionFactoryBean.class);

これがxmlでの私のBean定義です:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="configLocation" value="spring_mybatis_integration/mybatis_config.xml"></property>
  <property name="dataSource" ref="dataSource"></property>
</bean>

ご覧のとおり、Javaコードとxmlファイルの両方で、BeansqlSessionFactoryをクラスに関連付けてorg.mybatis.spring.SqlSessionFactoryBeanいますが、エラー出力で別の非相対クラス名が表示されるのはなぜorg.apache.ibatis.session.defaults.DefaultSqlSessionFactoryですか?

どうもありがとう!

バージョン情報:

  • mybatis 3.1.1
  • 春3.2.0
  • mybatis-春1.1.1
4

1 に答える 1

1

依存性注入を介してアクセスするポイントはありませんSqlSessionFactoryBean。通常、Factory Bean自体ではなく、Factory Beanによって作成されたオブジェクトを操作します。この場合、FactoryBeanはDefaultSqlSessionFactoryインスタンスを返します。

FactoryBeanインターフェースを使用したインスタンス化ロジックのカスタマイズを参照してください。

ただし、本当にFactoryBeanインスタンスにアクセスする場合は、アンパサンド記号を使用する必要があります。「 Spring:FactoryBean.getObject()の代わりにFactoryBeanオブジェクトを取得する」&を参照してください。

はい、ファクトリを返すFactory Beanの概念は少し混乱するかもしれませんが、それがSpringでの動作方法です。

だから、それはあなたが望むものSqlSessionFactoryの代わりである可能性が高いです。SqlSessionFactoryFactoryBean

更新:実際、MyBatisはSqlSessionFactoryBeanのドキュメントでこれを説明しています

SqlSessionFactoryBeanはSpringのFactoryBeanインターフェースを実装していることに注意してください(Springドキュメントのセクション3.8を参照)。これは、Springが最終的に作成するBeanはSqlSessionFactoryBean自体ではなく、ファクトリでのgetObject()呼び出しの結果としてファクトリが返すものであることを意味します。この場合、Springはアプリケーションの起動時にSqlSessionFactoryを構築し、sqlSessionFactoryという名前で保存します。

于 2013-01-27T09:04:48.423 に答える