Spring工程中JDBC抛出"EmptyResultDataAccessException"异常的解决方案-程序员宅基地

技术标签: solution  Spring  JdbcTemplate  

一、 问题日志

严重: Servlet.service() for servlet [spring] in context with path [/XXXXX] threw exception [Request processing failed; nested exception is org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0] with root cause
org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
	at org.springframework.dao.support.DataAccessUtils.nullableSingleResult(DataAccessUtils.java:97)
	at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:779)

二、 问题原因

顺藤摸瓜,打开"DataAccessUtils":

/**
 * Return a single result object from the given Collection.
 * <p>Throws an exception if 0 or more than 1 element found.
 * @param results the result Collection (can be {@code null}
 * and is also expected to contain {@code null} elements)
 * @return the single result object
 * @throws IncorrectResultSizeDataAccessException if more than one
 * element has been found in the given Collection
 * @throws EmptyResultDataAccessException if no element at all
 * has been found in the given Collection
 * @since 5.0.2
 */
@Nullable
public static <T> T nullableSingleResult(@Nullable Collection<T> results) throws IncorrectResultSizeDataAccessException {
    
	// This is identical to the requiredSingleResult implementation but differs in the
	// semantics of the incoming Collection (which we currently can't formally express)
	if (CollectionUtils.isEmpty(results)) {
    
		throw new EmptyResultDataAccessException(1);
	}
	if (results.size() > 1) {
    
		throw new IncorrectResultSizeDataAccessException(1, results.size());
	}
	return results.iterator().next();
}

从注释或者源码可以看出,数据库执行结果为0时,抛出"EmptyResultDataAccessException"异常,大于1时,抛出"IncorrectResultSizeDataAccessException"异常,这样设计有个好处,就是更加详细地反馈了数据信息,便于开发者处理查询结果。


三、 解决方案

在调用"queryForObject"方法的位置捕捉以上两种异常,参考:

public UserVO queryUserByEmail(String email) {
    
	String SQL = "select * from " + Const.User.TABLE_NAME + " where " + Const.User.COLUMN_EMAIL + " = ?";
	UserVO userVO = null;
	try {
    
		userVO = jdbcTemplate.queryForObject(SQL, new UserMapper(), email);
		if (userVO != null) {
    
			userVO.setPassword("");
		}
	} catch (EmptyResultDataAccessException e) {
    
		e.printStackTrace();
	} catch (IncorrectResultSizeDataAccessException e) {
    
		e.printStackTrace();
	}
	return userVO;
}

四、 参考文献

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zy13608089849/article/details/79891721

智能推荐

C++ STL Queue常用方法详解_std::queue 去重复-程序员宅基地

文章浏览阅读2k次。6.5 queue的常见用法详解​ 队列实现了一个先进先出的容器1. queue的定义​ 要使用queue,应添加头文件#include​ queue <typename> name;2. queue容器内元素的访问​ 队列本身就是一种先进先出的限制性数据结构,在STL中只能通过font()来访问队首元素,或是通过back()来访问队尾元素#include <bits/stdc++.h>#include <queue>using namespa_std::queue 去重复

【token验证】springboot通过实体类接收token,并获取其中的值的详细解析。_如何获取token中的载荷数据-程序员宅基地

文章浏览阅读2.3k次。token工具类–jwtutils首先在maven仓库里面下载这样一个工具包,然后导入到需要生成和解析token的模块中,然后创建对应类,来供服务层调用。1.生成token生成token的方法比较简单,就是一些固定的方法。设置一些编码方式,基本上都会固定的,然后.claim可以设置自己想要传进去的值,最后就把token返回出来。这些基本上都是固定的, 所以就不多说了。2.解析token解析token我们可能会简单的检验token是否合法,有时候我们会通过token获取token中载荷中的值2_如何获取token中的载荷数据

Jmeter - 使用Mail Reader Sampler读取Gamil的邮件_jmeter mail reader-程序员宅基地

文章浏览阅读1.4k次。1. 先在Gmail上设置打开pop, imap服务器2. 在帐户安全设置里打开允许低安全性应用访问3. 最后再在Jmeter上添加一个Mail Reader Sample, 设置服务器信息_jmeter mail reader

Nginx信号控制 —— 如何优雅的关闭Nginx进程以及日志切割_麒麟v10如何关闭nginx进程-程序员宅基地

文章浏览阅读1.4w次。一、引言 接着上节博客来,上节博客教了大家如何在Linux系统中安装nginx服务,也告诉了大家如何启动nginx服务了。那如果是在日常正常使用nginx当中,更改了配置文件,那有如何将nginx优雅的重启。可不要像上节博客使用kill -9 来杀死进程,万一客户下单操作一半,结果你这直接将nginx进程杀死,这就尴尬了。 本章就介绍如何用信号来控制nginx!!!二、Nginx信号控制使用..._麒麟v10如何关闭nginx进程

基于支持向量机的文本分类_支持向量机对于文本分类文献-程序员宅基地

文章浏览阅读3.9k次,点赞3次,收藏15次。基于支持向量机SVM的文本分类的实现1 SVM简介 支持向量机(SVM)算法被认为是文本分类中效果较为优秀的一种方法,它是一种建立在统计学习理论基础上的机器学习方法。该算法基于结构风险最小化原理,将数据集合压缩到支持向量集合,学习得到分类决策函数。这种技术解决了以往需要无穷大样本数量的问题,它只需要将一定数量的文本通过计算抽象成向量化的训练文本数据,提高了分类的精确率。 支持向量机(SVM)算法_支持向量机对于文本分类文献

生成10位随机数(PHP)_php随机生成10个数字-程序员宅基地

文章浏览阅读2.1k次。【代码】生成10位随机数(PHP)_php随机生成10个数字

随便推点

Make your own Pytorch-YOLOv3_dbl+conv-程序员宅基地

文章浏览阅读676次。Make your own Pytorch-YOLOv31.主干网络(backbone)YOLOv3主干网络是darknet53,主要是由基本的模块ResBlock连接而成,没有网络分支,前向传播较为简单。基本的ResBlock模块代码如下所示,主要是交替完成1x1和3x3的卷积,每个卷积之后都应用了BN层和LeakyReLU层。# 本文注释的数字都是以416x416的图像作为输入,类别参考VOC共20个类别。class BasicBlock(nn.Module):def __init__(se_dbl+conv

android调用unity_android 调用 unity unitysendmessagemethod.invoke 无效-程序员宅基地

文章浏览阅读502次。上一篇说到了unity调用androi,这里说说android调用unity: /** * 调用Unity的方法 * * @param gameObjectName 调用的GameObject的名称 * @param functionName 方法名 * @param args 参数 * @return 调用是否成功 */ boolean callUnity(String gameObjectNam._android 调用 unity unitysendmessagemethod.invoke 无效

Node+Egg上传文件流到ftp服务器_eggjs ftp-程序员宅基地

文章浏览阅读1.3k次。作为一个Java开发人员,猛的要写一点js,还是有点困难的,搞了几天,终于解决了Node上传流到ftp的问题,保留一下心得吧!由于项目使用Egg架构,但是Egg很多技术并不完善,网络上都科普不到,所以部分代码使用Node原生实现。实现上传的主要逻辑如下:1.用户发起请求,上传文件流;2.Egg接受文件流(Egg已经封装了这部分技术,使用起来很方便)3.保存文件流到本地服务器(因..._eggjs ftp

中科蓝讯(第一次使用指南)_中科蓝讯sdk-程序员宅基地

文章浏览阅读3.7k次,点赞2次,收藏15次。中科蓝讯 新手指南_中科蓝讯sdk

SpringBoot 下集成缓存工具类 CacheManager_springboot cachemanager-程序员宅基地

文章浏览阅读7.1k次,点赞2次,收藏9次。Java 缓存工具类 Cache 工具类定义SpringBoot 的 CacheManager 接口测试_springboot cachemanager

java 反射获取子类_java获取全部子类或接口的全部实现-程序员宅基地

文章浏览阅读5k次。在JAVA中,获取一个类的全部父类是比较简单的,只需要通过反射(Class的getSuperclass()方法)即可。然而,如果想获得一个类的所有子类,或者获得实现某一个接口的所有实现类,相对比较麻烦。用过Eclipse的开发人员都知道,通过F4键或(Ctrl+T组合键)可以查到指定类的类层次结构。仔细想一下该快捷键的实现原理,或许可以找到一个可行的设计思路。首先,需要确定一个前提是,寻找所有子类..._反射获取子类

推荐文章

热门文章

相关标签