`

Spring整合MyBatis 由于类名相同导致启动异常

阅读更多

开始之前我们先落实一些叫法

java.lang.System 全限定名

java.lang 包名

System 类名

 

OK,通过Spring整合MyBatis,sqlSessionFactory配置如下

 

    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="typeAliasesPackage" value="com.myapp" />
        <property name="mapperLocations" value="classpath:/mybatis/**/*Mapper.xml" />
    </bean>

  

    其中typeAliasesPackage的作用是自动扫描Entity,这个时候会自动取对应包中不包括包名的简单类名作为包括包名的别名,及只取类名。多个package之间可以用逗号或者分号等来进行分隔。

    mapperLocations的作用是指定Mapper文件的位置

 

启动的时候停在这个位置。

 

:oejs.Server:jetty-7.6.2.v20120308
:/web:Initializing Spring root WebApplicationContext

 

问题解决

    经检查发现,发现项目中存在一个类,与项目中某Mapper配置文件中resultType指向的类的全限定名不同,但类名相同的类存在。将该类名修改后正常启动。

 

后续测试

    后续测试了一下,无论Mapper.xml是否有调用到,只要项目中存在两个类的类名相同就会无法启动,哪怕全限定名不同也不行。

另外需要注意的是,

1. 不单指与MyBatis有关的Entity。哪怕是同一个类名的Controller存在也无法启动;

2. 相同类名不区分大小写。

 

猜想

    估计MyBatis配置中typeAliasesPackage扫描到的类,只保存了小写形式的类名,所以比如在配置文件中的resultType可以直接写string这种形式。通过读源码证实了猜想结果。

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics