本文是对博客系统开发中遇到的bug总结,当然这只是一部分记录(●’◡’●)
推荐阅读:
- 继瑞吉外卖后的又一个项目——SpringBoot+Vue的前后端博客系统
Bug1:SpringBoot启动失败
问题背景:在使用MyBatisX插件生成代码后,编写完测试Controller,然后启动SpringBoot访问URL,结果报错java.lang.IllegalStateException: Failed to load ApplicationContext
问题原因:tb_user_role是一张关系表,他又两个id,user_id和role_id,MyBatisX在生成对应实体类时,自动添加了两个@TableId
注解,由于一张表只能存在一个主键,所以启动报错
问题解决:将两个@TableId
注解都删除
温馨提示:如何一个实体类中不存在@TableId,则无法使用MyBatisPlus的 xxxById方法,关系表好像也不需要使用byId方法
Bug2:Knife4j接口文档无法访问
/api/common
后,无法访问Knife4j的接口文档,然后又为Knife4j配置了路径映射,但是仍然与计无补Bug4:自定义接口文档的Footer失败
DocumentationType.OAS_30
,而我指定的是DocumentationType.SWAGGER_2
,这是Knife2.x版本的DocumentationType.OAS_30
,完成这三部即可成功配置Footer参考文章:
3.24 自定义Footer | Knife4j (xiaominfo.com)
3.0.2版本自定义配置不生效 · Issue #I29TLI · 萧明/knife4j - Gitee.com
knife4j 2.x 升级 3.x 版本后自定义文档不生效解决【附自定义响应状态码配置】一壶浊酒伴余生的博客-CSDN博客
Bug3:热部署依赖失效
问题背景:在多模块项目中,一个父模块用于控制依赖版本,然后是三个子模块(一个公共模块、一个前台模块、一个后台模块),在父模块中配置好以来,然后在公共模块引入对应的热部署依赖,配置好IDEA的各种热部署相关配置,结果热部署失效
PS:主要是之前没怎么开发过多模块的项目,单模块项目热部署依赖配置是可以生效的
问题原因:暂且未知
问题解决:待定
Bug4:SpringSecurity默认登录页面加载失败
参考文章:
- SpringSecurity踩坑之-默认登陆页加载异常_yuyang_ing的博客-CSDN博客
Bug5:存入Redis的用户信息出现乱码
Bug6:无法根据id查询出对应的分类
问题背景:在根据id查询分类时,发现前端无法接收到分类信息,但是在后端接口测试时,却可以得到正确的结果
问题原因:由于分类表的主键ID是Long类型的,传递给前端时,会发生精度丢失问题。在Java中,Long类型的数据是64位有符号整数,可以表示范围在 − 2 6 3 -2^63 −263到 2 6 3 − 1 2^63-1 263−1之间的整数。而在前端中,JavaScript使用的是IEEE 754标准的双精度浮点数(64位),可以表示范围在 − 2 5 3 -2^53 −253到 2 5 3 2^53 253之间的数值,因此比Java中的Long类型范围更小
问题解决:自定义一个消息转换器,然后将所有传递给后端的Long类型数据转换成String类型
Bug7:无法查询出子评论
问题背景:在实现查询文章的评论功能时,我需要实现父子评论功能(即根评论嵌套子评论的二级结构),结果只展示了根评论,没有展示子评论
问题原因:
问题1:在构建子评论时,出现了逻辑错误(递归出现了问题)
问题2:添加orderByDesc(Comment::getCreateTime)
就无法查询到子评论
问题解决:
问题1:最终通过Debug的方式定位到了问题,然后进行了逻辑修改
问题2:暂时没有有较好的方法,但是我改用stream流实现排序
Bug1:无法新增已删除的标签
Bug2:无法访问Knife4j接口文档
nested exception is java.lang.NumberFormatException: For input string: "doc.html"
Bug3:SpringSecurity拦截了Knife4j的接口请求
.anyRequest().authenticated()
),问题出现在,Knife4j接口文档能够在浏览器上访问,但是不显示接口参考资料:
- 3.5 访问权限控制 | Knife4j (xiaominfo.com)
- springboot + security + swagger+Knife4j springboot整合swagger swagger优化,接口文档生成多包扫描,security免登陆 生成接口文档_binglong180的博客-CSDN博客
Bug4:参数校验失效
问题背景:在实现新增友链功能时,使用@NotBlank对参数进行判空,从而避免项目中出现过多的if-else,但是最终发现判空失效
问题原因:对于spring-boot-starter-validation
使用不熟练
问题解决:
1)对于Parameter类型(请求头)的参数,需要在Controller类上加上@Validated
注解
2)对于Body类型(请求体)的参数,需要在@RequestBody上加上@Validated
或者是 在Controller类上加上 @Validated
,在@RequestBody 上加上 @Valid
综合1)和2),为了便于记忆,统一在Controller类上加上 @Validated
,对于1)直接不用干啥了,对于2)直接添加@Valid
参考资料:
- Springboot @NotBlank参数校验失效汇总_springboot 参数校验不生效_爱码僧的博客-CSDN博客
- @NotBlank @NotNull 全局捕获异常返回自定义封装_一个正在努力的菜鸡程序员的博客-CSDN博客
- spring spring-boot @valid @NotNull @NotEmpty 基本校验使用以及 全局异常优化集成-CSDN博客
- @Validated和@Valid区别_@vadiation_程序猿拯救世界的博客-CSDN博客
- spring-boot-starter-validation进行参数校验_吹灭读书灯-CSDN博客
Bug1:执行 npm i 报错
npm i
下载项目所需依赖但是直接报错ENOENT: no such file or directory, open ‘D:\Node\package.json‘
,D:\Node\
)下无法找到 package.json
文件npm init -f
再安装npm i
参考文章:(npm install执行报错:ENOENT: no such file or directory, open ‘D:\Node\package.json‘_-CSDN博客
Bug2:删除最后一页的记录时,会清零需要手动刷新页面
问题背景:在实现后台系统的标签管理时,分页展示了标签数据,第2页只有一条记录时,直接将它删除,跳转到第一页但是数据会清零,需要手动刷新
问题原因:前端分页请求currentPage没有实时更新。由于我删除了最后一页的数据,但是pageNum和pageSize这两个参数没有发生变化,此时分页虽然跳转到第一页,但是发送的分页查寻请求还是最后一页的,由于最后一页的数据已经被删除了,所以此时就显示第一页的数据为空了
问题解决:
PS:本人用的是方案二
参考资料:
- MyBatis-Plus分页:删除最后一页最后一条数据后显示无数据(后端解决方法) - 简书 (jianshu.com)
- 解决 “element分页:删除最后一页的所有数据后,currentPage显示正确,但列表内容为空” 的问题-CSDN博客
Bug3:添加不符合规范的菜单,会导致加载缓慢
问题背景:在实现菜单管理功能时,在测试添加菜单功能时,如果选择添加主类目,但是路由地址却是多级的,此时菜单能够添加成功,但是刷新页面时,数据加载不出来
问题原因:由于前端的菜单是动态生成的,当我们添加主类目时,如果路由地址是多级的,就会导致Vue去寻找一级菜单,但此时本身就是一级菜单,这就导致Vue加载不出来菜单
问题解决:
虽然经过后端校验,但是还是有问题!
Bug4:修改角色无法及时响应
$nextTick
方法来在视图更新后执行一些操作。$nextTick
会在DOM更新后执行传入的回调函数,确保你可以在更新后获取到最新的DOM结构。