您的位置:首页 > 移动开发

Mybatis报错——Type interface com.mapper.EmployeeMapper is already known to the MapperRegistry.

2017-12-20 23:15 676 查看

Mybatis报错——Type interface com.mapper.EmployeeMapper is already known to the MapperRegistry.

先说我发生这个错误的原因吧:EmployeeMapper.xml映射文件被单独注册一次,批量注册的包中包含也EmployeeMapper.xml动态绑定的EmployeeMapper.java。也就是说EmployeeMapper接口(与EmployeeMapper.xml动态绑定的接口)被重复注册了两次。

如果你的问题解决了,那么恭喜,并不用看下去了。

报错如下

org.apache.ibatis.exceptions.PersistenceException:
### Error building SqlSession.
### The error may exist in com/mapper/EmployeeMapper.java (best guess)
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.binding.BindingException: Type interface com.mapper.EmployeeMapper is already known to the MapperRegistry.
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
.................
.................
at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:118)
... 28 more


报错背景:

用mybatis框架获取数据库信息时发生的。

mybatis-config.xml文件中
<mappers>
节点下,既有
<mapper />
又有批量注册这两个子节点。代码如下:

<mappers>
<mapper resource="EmployeeMapper.xml" />
<!-- 批量注册 :接口与映射文件要在同一个包下 -->
<!-- 通过package元素将会把指定包下面的所有Mapper接口进行注册 -->
<package name="com.mapper"/>
</mappers>


再看我的项目,如图:



我的项目中EmployeeMapper.java文件存在于com.mapper包中,而EmployeeMapper.xml类动态绑定了EmployeeMapper.java,

EmployeeMapper.xml文件如图:



异常分析

以上配置就导致了,与EmployeeMapper.xml映射文件绑定的EmployeeMapper.java被注册了两次。

<!-- 第一次 -->
<mapper resource="EmployeeMapper.xml" />
<!-- 第二次:批量注册:该包下所有映射文件及绑定的接口都会被注册  -->
<pa
ac85
ckage name="com.mapper"/>


尽管EmployeeMapper.xml映射文件不在该包下,但是与其绑定的EmployeeMapper类的源文件EmployeeMapper.java文件在该包下,在mybatis中的MapperRegistry就会认为EmployeeMapper被注册了两次。故而报错:EmployeeMapper is already known to the MapperRegistry.(EmployeeMapper已存在)。

如果EmployeeMapper.xml也在批量注册的包下,那也是一样的。

关键在于EmployeeMapper接口(与EmployeeMapper.xml动态绑定的接口)被重复注册了两次。

问题解决方案

检查是否有被重复注册的与映射文件动态绑定的接口
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐