Mybatis 遇到的坑 required a single bean, but 2 were found

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis 遇到的坑 required a single bean, but 2 were found相关的知识,希望对你有一定的参考价值。

参考技术A 报错信息说  AccountDubboServiceImpl 类中使用 @Autowired 注入了一个 ITAccountService 接口的实现类,这个接口竟然有连个实现类???有没有搞错,我实现了一个接口好不不好,最后打印 spring beanDefinitionNames 发现确实是有连个实现类,这是怎么回事呢?我明明只有一个实现类

原来在使用 @MapperScan 扫描 mapper  接口,指定报名的时候没有告诉 mabatis 扫描包的具体路径,

这时 mabits 会把这个包的的接口以及子包的接口通通生成一个代理类注入都 IOC 容器中,key 就是接口的名字,而真正的实现类也会被装载到 IOC 容器中,实现类首字母小写就是 IOC 的 key ,这时就有两个实现类了,通过 @Autowired 注入的 Bean 就不知道找那个 bean 了,是不是很坑?修改 @MapperScan 包扫描路径精确到具体 mapper 包问题解决

或者使用另一种方法,在 mapper 接口上加上 @Mapper 注解,不使用 @MapperScan 注解

Mybatis 搭建遇到的坑

1.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com">
<select id = "findById" parameterType="int" resultType="User">
SELECT * FROM Book WHERE id=#{id}
</select>
</mapper>

提示下面飘红不可用,导致在其他类里面引用:

import org.apache.ibatis.io.Resources;

import org.apache.ibatis.*,未能找到
我还以为是缺少jar ibatis ,在pom.xml中 配置ibatis也不能成功,花费了不少时间.
解决办法:
在 File->Settings->Schemas and DTDs 中配置不信任链接

2. SqlSession session = sqlMapper.openSession(); 获取不到session值,为null

@font-face{ font-family:"Times New Roman"; } @font-face{ font-family:"宋体"; } @font-face{ font-family:"Calibri"; } @font-face{ font-family:"SimSun"; } p.MsoNormal{ mso-style-name:Normal; mso-style-parent:""; margin:0pt; margin-bottom:.0001pt; font-family:Calibri; mso-fareast-font-family:SimSun; mso-bidi-font-family:\'Times New Roman\'; } span.msoIns{ mso-style-type:export-only; mso-style-name:""; text-decoration:underline; text-underline:single; color:blue; } span.msoDel{ mso-style-type:export-only; mso-style-name:""; text-decoration:line-through; color:red; } @page{mso-page-border-surround-header:no; mso-page-border-surround-footer:no;}@page Section0{ } div.Section0{page:Section0;}

Caused by: java.lang.NullPointerException

at org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource(DefaultSqlSessionFactory.java:95)

... 2 more

出错原因:
一开始按照教程操作,在配置mybatis-config.xml的时候 <environments default="development">

调试发现session 为null,
找到这篇解释,出自: https://blog.csdn.net/u012972315/article/details/51725646
下面为引用内容:

后来查看mybatis文档才了解到,在mybatis配置时,可能由于我们开发时的数据库环境和最终上线时的数据库环境不同,因此可以在配置文件中配置多个数据库环境;
即在 < enviroments >标签下可以配置多个< enviroment>标签,每一个< enviroment >标签对应一个数据库环境
而不同的数据库环境通过< enviroment > 标签的 id 属性用以区分
那么具体开发时如果知道使用的是哪一个环境呢?
在< envirments> 标签里有一个default属性,该属性对应的是下面的不同的< enviroment > 的id属性
default的值为哪一个id,则代表此时使用的是哪一个environment数据库环境

解决办法: <environments default="book">,default= 需要使用数据库的id.
<!-- 对事务管理和连接池配置 -->
<environments default="book">
<environment id="book">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/gossip"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
3.
WARN: Establishing SSL connection without server\'s identity verification is not recommended.
According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn\'t set.
For compliance with existing applications not using SSL the verifyServerCertificate property is set to \'false\'.
You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore
for server certificate verification.
出错原因:
mybatis-config.xml 配置中需要增加一句 &useSSL=false,
<property name="url" value="jdbc:mysql://localhost:3306/gossip?autoReconnect=true&amp;useSSL=false"/>
注意 在xml中,
& : &amp;
< : &lt;
> : &gt;
" : &quot;
\' : &apos;

以上是关于Mybatis 遇到的坑 required a single bean, but 2 were found的主要内容,如果未能解决你的问题,请参考以下文章

记一次若依微服务版mybatis升级mybatis-plus之后遇到的坑

Mybatis 搭建遇到的坑

Mybatis遇到的坑

spring整合mybatis遇到的坑

Mybatis中Mapper.xml 文件使用注释遇到的坑

Mybatis中Mapper.xml 文件使用注释遇到的坑