最近在部署性能测试环境的时候,环境 部署好以后,部分功能出现接口查询异常,问题现象:

拿到错误,肯定要先判断是前端还是后端代码的问题,最简单的方式是抓包查看:

以上是报错页面捕获的接口报错,很明显的接口已经报错了,那么就直接查看后端的日志:

查看日志分两步:

1.查看网关web端的日志:

从日志可以知道,出错的地方在selectOrgDetail接口查询上

com.xxx.postlend.debtmanagement.service.org.impl.OrgServiceImpl.selectOrgDetail(OrgServiceImpl.java:42)

2.继续查看APP服务端的日志报错:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException:

nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2

你想查询一条数据,但是从数据库返回两条数据

看到这个错误,就知道是查询数据库的记录,查询到2条,而期望的结果是1条,即selectOne函数的查询结果,导致报错

到这个错误的原因就是因为你的查询方法中得到两个两个结果集,然而你的返回用了一个实体去接收,程序这个时候就不知道如何去分配了,很果断的报这个错,

修改方法为使用一个list来接收就没有问题了。

其实从这个selectOne方法也可以猜出来

期望selectOne()返回一个结果(或null),但找到:2

然后我就看了下dao层的接口 是Office getOffice(id); 查的是一条数据,可结果返回的是2条数据的结果集。当然报错咯!

解决方法是将接口改为list

List<Office>getOffice(String id);

mybatis和spring整合后,dao中的接口
public Student getUser(Student userStudent);

会自动选择selectOne()方法,由于只能返回一个对象的结果,当返回到多个对象的结果集时报错。getUser是一个student类的bean无法接受多个结果集,则改用List就可以接受多个结果集

将dao中的
public Student getUser(Student userStudent);

改为
import java.util.List;
public List<Student> getUser(Student userStudent);

从日志报错的信息查看,问题出现在APP端的代码如下:

at com.xxx.postlend.debtoauth2.service.biz.impl.OrganizationServiceImpl.selectOrgDetailInfo(OrganizationServiceImpl.java:217)

通过代码查看,这个selectOne查询方式是mybatis框架的自动生成sql查询语句,所以无法查看具体的sql mapper映射文件

需要通过监控,这个接口执行的所有sql如下:

拿到上述的sql去mysql客户端工具里执行验证一下,查看是否存在主键查询出现两条记录的sql

果然发现存在2个orgId导致的报错,删除两个记录中的一个

问题完美解决

通过这个例子,其实大家在测试过程中肯定会遇见各种各样的环境问题,当出现问题的时候,首先判断问题的类型

然后通过web端还是app端的问题,通过日志打印的堆栈,以及查看代码的方式,寻找问题的出现的原因,这样才能慢慢的提升

测试环境部署之填坑记录-Expected one result (or null) to be returned by selectOne(), but found: 2的更多相关文章

  1. Expected one result (or null) to be returned by selectOne(), but found: 2 和 java.lang.UnsupportedOperationException异常

    在学习MyBatis的时候,简简单单的MyBatis+MySql的增删改查操作,但是却出了问题. 刚开始数据库只有一条数据的时候,岁月静好,一切看起来都那么的OJBK.但是,当我往数据库插入第二条数据 ...

  2. Caused by: org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2

    异常信息 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with na ...

  3. Expected one result (or null) to be returned by selectOne(), but found: 3

    Expected one result (or null) to be returned by selectOne(), but found: 3 返回应该是对象但是给的是list

  4. Expected one result (or null) to be returned by selectOne() 数据库结果集和java实例

    mybatis会根据查询的结果集初始化java实例. 如果是复杂类型,我们一般都会在mapper中做好映射. 1.所以如果查询到的是多个结果,那么对应的java类型也必须的集合类型.(result 为 ...

  5. org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3报错解决

    报错的原因翻译出来: 预期的一个结果(或null)返回selectOne(),但发现:3 意思就是你想得到一个结果值,但是返回了三个结果值. 一般可能测试的时候我们存了几条一样的数据,在登录时,会把同 ...

  6. Expected one result (or null) to be returned by selectOne(), but found 2

    这个问题在于你查询sql返回结果是多个值.一个集合,但是你在service的实现层的dao都调用了.get方法.而是应该使用.getlist方法等.

  7. 【java异常】Expected one result (or null) to be returned by selectOne(), but found: 63

    OmQuotaTBBean omQuotaTBBean = mOmQuotaTBMapper.findOmQuotaTB(); 改成 List<OmQuotaTBBean> listOmQ ...

  8. kubernetes实战之consul简单测试环境搭建及填坑

    这一节内容有点长,我们将介绍如何基于docker搭建一client一server的consul测试环境,以及如何搭建多server consul测试集群.在基于docker搭建多server的cons ...

  9. Kafka踩坑填坑记录

    Kafka踩坑填坑记录 一.kafka通过Java客户端,消费者无法接收消息,生产者发送失败消息 二. 一.kafka通过Java客户端,消费者无法接收消息,生产者发送失败消息 在虚拟机上,搭建了3台 ...

随机推荐

  1. CROSS-ENV不同环境配置

    项目背景 为了适应h5环境搭建需求,需要动态配置开发,测试,生产三种对应域名及其及打包命令.使用cross-env可以让配置环境更加清晰明了还好管理. 简介 cross-env的作用是不需要全局配置N ...

  2. Java面试题_第四阶段

    1.1 电商行业特点 1.分布式 垂直拆分:根据功能模块进行拆分 水平拆分:根据业务层级进行拆分 2.高并发 用户单位时间内访问服务器数量,是电商行业中面临的主要问题 3.集群 抗击高兵发的有效手段, ...

  3. Aery的UE4 C++游戏开发之旅(2)编码规范

    目录 C++基础类型规范 命名规范 头文件规范 字符串规范 字符集规范 参考 C++基础类型规范 由于PC.XBOX.PS4等各平台的C++基础类型大小可能不同(实际上绝大部分都是整型类型的大小不同) ...

  4. Go 开发关键技术指南 | 为什么你要选择 GO?(内含超全知识大图)

    作者 | 杨成立(忘篱) 阿里巴巴高级技术专家 关注"阿里巴巴云原生"公众号,回复 Go 即可查看清晰知识大图! 导读:从问题本身出发,不局限于 Go 语言,探讨服务器中常常遇到的 ...

  5. SQLserver、MySQL、ORCAL查询数据库、表、表中字段以及字段类型

    一.SQLServer命令 1.查询SQLServer中的每个数据库 SELECT * from sysdatabases 2.查询SQLServer中指定数据库的所有表名 select name f ...

  6. C++常用的string字符串截断函数

    C++中经常会用到标准库函数库(STL)的string字符串类,跟其他语言的字符串类相比有所缺陷.这里就分享下我经常用到的两个字符串截断函数: #include <iostream> #i ...

  7. CLAMP 1.0.1 Vulnhub Walkthrough

    主机层面端口扫描探测: ╰─ nmap -p1-65535 -A -sV 10.10.202.137 访问web服务 使用dirbuster 加大字段进行目录爆破 http://10.10.202.1 ...

  8. 再看Java之温故知新(体系篇)

    一 数据类型 1.1 8种基本数据类型 1.2 引用数据类型 1.3 java内存机制 1.3.1 寄存器 1.3.2 栈 1.3.3 堆 1.3.4. 静态区/方法区 1.3.5. 运行时常量池(R ...

  9. vue 脚手架

    Vue 脚手架的基本用法 1. 基于 3.X 版本的脚手架 创建vue项目 命令行(CLI) 的方式创建 vue 项目 vue create my-project 图形化界面(GUI) 的方式创建 v ...

  10. Linux禁用root用户

    在创建各种云主机的时候,云服务商给的都是root用户,这很方便,但是有某些时候会造成一些困扰,日后在服务器上启动各种服务后,仅仅拥有root权限的用户才能访问更改这些服务,这样会造成一些不必要的困扰, ...