笔记:自己开发中遇到的一些错误
1. Feign Client with Spring Boot: RequestParam.value() was empty on parameter 0
2. 调用 Mapper 的查询方法时,明明没调用 PageHeler.startPage() 方法,但却发现执行的 SQL 语句被自动拼接上了 LIMIT 分页参数
- PageHelper 在拦截查询方法时,如果发现查询前没有调用过 startPage() 方法,则还会再看 supportMethodsArguments 参数
- 如果 supportMethodsArguments 为 true ,则会从查询方法的参数中找到 pageNum 参数和 pageSize 参数
- 如果这两个参数都不为 null,则会自动进行分页,相当于 HageHelper 自动帮我们调用了 startPage() 方法
- 因此,如果 Mapper 的查询方法是以 PageXxxBO 之类的形式来接收参数,但不需要分页,就要注意了,避免不知不觉地自动分页
- supportMethodsArguments 默认是 false;与 Spring 整合时可通过 pagehelper.supportMethodsArguments=true 配置来开启
- 以上结论可以自行通过查看 PageParams#getPage() 方法来进行验证
3. bootstrap 配置文件明明指定了远程 nacos 地址,但项目运行时使用的 nacos 却是 localhost;idea 重新编译项目,还是一样的错误
- 该配置文件可能没有编译到 target 目录下,导致项目采用默认的配置,即 localhost ;因此只需将这个配置文件复制到 target 目录即可
4. str.substring(begin, end) 抛出下标越界异常,提示信息为 String index out of range: {idx},但 idx 不等于 begin 也不等于 end
- 此时 idx 的值为 end - begin,具体原因可以看 substring() 方法的源码
5. 一些常见的异常提示及错误
For input string: "" // Integer.valueOf()等方法在解析失败时抛出的NumberFormatException
No enum constant XxxEnum.Abc // 调用了XxxEnum.valueOf("Abc")方法,且枚举中没有叫做"Abc"(区分大小写)的实例
"".split(",") // 返回结果是 [""] 而不是空数组
example.createCriteria().andIn("id", ids) // 通用Mapper中,调用Criteria的andId()方法时,集合至少要有一个元素,否则SQL会出错
6. 该传的参数都传了,却没调用到 Controller 的相关方法
控制器方法的形参如下:
前端传的参数如下:
通过 Debug ,获取 request 对象,发现参数后面有空格(再看看上面那张图,冒号前面确实有一个空格),导致没接收到参数而报参数错误!
7. 使用 slf4j 打印数组信息时,数组只打印了第一个元素
如图,通过 Debug 得知 queueNames 数组中有 2 个元素:
但日志打印如下:
这是因为如果直接传数组,则框架直接调用了下面这个方法:
这种情况下,日志模板中的第 i 个 "{}" 会被替换成数组中第 i 个元素,而模板中只有一个 "{}" ,因此日志只打印了数组的第一个元素。
// 正确做法1:将queueNames放入另一个数组中;这样解析的时候就会将第一个"{}"替换为queueNames
log.info("初始化消费者,监听队列:{}", new Object[] {queueNames});
// 正确做法2:将数组封装成List,这样框架会自动将该list放入一个数组中,从而将第一个"{}"替换成该list
log.info("初始化消费者,监听队列:{}", Arrays.asList(queueNames));
8. 使用 mybatis 时,自定义的排序方式不生效
比如,我们想要通过 orderBy 参数来指定排序的方式,动态 SQL 如下:
SELECT * FROM class <if test="orderBy == 1"> ORDER BY update_time </if> <if test="orderBy == 2"> ORDER BY class_sort </if>但我们发现,无论 orderBy 是 1 还是 2 ,查询结果都没有根据 updateTime 或 classSort 进行排序
查看执行的 SQL 语句,发现执行的 SQL 是 SELECT * FROM class ORDER BY 1/2
猜想:orderBy 相当于 mybatis 中的关键字,不能随便使用
猜想:上面动态 SQL 其实相当于 SELECT * FROM class ,mybatis 解析时,发现 orderBy 参数不为空,因此又拼接上了 ORDER BY ${orderBy}
解决方法:1. 直接通过 orderBy 参数传入 SQL 的排序语句; 2. 将 orderBy 参数改成 orderType 等参数
查看11道真题和解析