“名为XXX的Bean必须是[XXX]类型,但实际上类型为[XXX]”

时间:2013-01-27 08:55:22

标签: spring integration mybatis

当我整合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文件中,我将bean sqlSessionFactory与类org.mybatis.spring.SqlSessionFactoryBean相关联,为什么错误输出告诉我另一个非相对类名{{1 }}?

非常感谢!

版本信息:

  • mybatis 3.1.1
  • spring 3.2.0
  • mybatis-spring 1.1.1

1 个答案:

答案 0 :(得分:1)

通过依赖注入访问SqlSessionFactoryBean是没有意义的,通常我们使用Factory Beans创建的对象,而不是Factory Beans本身,在这种情况下,Factory Bean返回DefaultSqlSessionFactory实例。

请参阅Customizing instantiation logic with the FactoryBean Interface

但是,如果您确实想要访问FactoryBean个实例,则应使用符号符号&,请参阅Spring: Getting FactoryBean object instead of FactoryBean.getObject()

是的,返回工厂的工厂豆的概念可能有点令人困惑,但这就是春天的工作方式。

所以可能SqlSessionFactory而不是SqlSessionFactoryFactoryBean就是你想要的。

更新:实际上MyBatis甚至在SqlSessionFactoryBean

的文档中对此进行了解释
  

请注意,SqlSessionFactoryBean实现了Spring的FactoryBean   接口(参见Spring文档的3.8节)。这意味着   bean最终创造的bean不是   SqlSessionFactoryBean本身,但工厂返回的结果   在工厂上调用getObject()。在这种情况下,春天会   在应用程序启动时为您构建一个SqlSessionFactory并存储它   名称为sqlSessionFactory