笔记:自己开发中遇到的一些错误

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 等参数

全部评论

相关推荐

02-26 09:15
已编辑
蚌埠学院 golang
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务