【用户中心项目后端】【球内后端报错/踩坑汇总大合集及项目补充关键前置知识】


上周学习了用户中心项目,目前已经把后端代码完成了,由于是看完后端视频后,直接独自复现,然后加上本人为蒟蒻只学过一点点Spring boot,基础也不扎实,踩坑无数。


为了让后续🐟友不用像我一样痛苦,现在把我自己踩的坑和原来发布在球内的贴子报错解决一同合并,方便后续大家学习。


再补上一些视频里没有细讲的知识点,让和我一样的小白能更好理解项目。



说明一下:报错合集只是为了减少痛苦,并不赞成大家一上来就直接查看,优先自己想办法解决,看一下鱼皮发的报错解决手册,消耗过多时间无法解决再来查看有无类似解决方法。


本人学艺不精,如果写的有误,欢迎大家批评指正。


也欢迎大家评论补充或者提问,方便一贴解决所有问题。


先贴上一下用户中心后端的前置学习知识点,然后再下面才是报错合集。



前置学习知识点:


1. 什么是断言


断言是用于测试我们认为是正确的代码来帮助检测错误的一种方式


Junit单元测试之断言(Assert)_assert.asserttrue-CSDN博客


简单使用Junit进行断言测试:

如果两者一致, 程序继续往下运行.

如果两者不一致, 中断测试方法, 抛出异常信息


Junit断言的方法

assertEquals方法:如果预期值与真实值相等,则运行success,反之Failure。

assertEquals 运行Failure会有错误提示,提示预期值是xxx,而实际值是xxx。容易调式


/**
Asserts that two ints are equal. 断言两个int是相等的
*/
static public void assertEquals(int expected, int actual) {
assertEquals(null, expected, actual);
}



assertTrue方法:

assertTrue 如果为 true,则运行 success,反之 Failure

没有错误提示


实际运用:

Assertions.assertTrue(result);



2. 对于工具类的使用


我使用的是的Hutool,也可以替换成其他类似的。

使用需导入hutool的依赖,Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率。

导入如下依赖:

<!--hutool -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.16</version>
</dependency>


2.1 Hutool进行值为“空”的判断:


common lang3库常用有的StringUtils、ObjectUtils用来做非空判断


这里用StrUtil.isAllNotEmpty()方法同时判断多个字符串a,b,c是否为空:

StrUtil.isAllNotEmpty(a,b,c)//hutool带的isAllNotEmpty方法,返回一个bool类型


2.2 使用Hutool的SecureUtil类进行摘要算法加密(加密密码):


使用SecureUtil.sha256()方法加密


String Ciphertext= SecureUtil.sha256(noise+password);//这里同时传入混淆的噪声和需要加密的字符


因为SHA256()既有运算速度又保证了安全性的平衡,所以选择该方法


hutool还可以使用:md5(),sha1()等方法加密



3. Mybatis Plus之条件构造器queryWrapper进行查询


下面几篇文章说得还可以:

条件构造器queryWrapper学习


Mybatis-Plus项目中使用eq方法


queryWrapper查询表中所有数据



其中视频中用到的Mybatis-plus的IService的save方法:

// 作用是插入一条记录,T是实体类
boolean save(T entity);


还有用的this.save()也是相同方法:

boolean res = this.save(newUser);


使用继承ServiceImpl类中实现的IService接口中封装的save()方法,成功/失败后会返回bool值



将输入参数进行比对:


MyBatisPlus查询方法selectById、selectOne、selectBatchIds、selectByMap、selectPage的使用




4. 正则表达式的使用


什么是正则表达式:

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。


如何使用正则表达式过滤特殊字符:

private static final String ACCOUNT_PATTERN = "^[^\\W_]+$";//我的过滤字符的正则表达式
Pattern pattern = Pattern.compile(ACCOUNT_PATTERN);//输入正则表达式ACCOUNT_PATTERN
Matcher matcher = pattern.matcher(userAccount);//输入要匹配内容
if(matcher.matches())return -1;//进行匹配


  1. Pattern类的作用在于编译正则表达式后创建一个匹配模式.
  2. Matcher类使用Pattern实例提供的模式信息对正则表达式进行匹配
  3. compile方法用于将给定的正则表达式编译成一个模式(输入正则表达式)。
  4. matcher方法创建一个匹配器,将给定的输入与该模式进行匹配(输入要匹配的字符串)。
  5. matches方法用于尝试将整个区域与模式匹配。如果匹配成功,则可以通过start、end和group方法获取更多信息。 该函数返回一个布尔值,如果整个区域序列与匹配器的模式匹配,则返回true,否则返回false。



5. 设置登录状态,关于session


可以先看下面几篇文章理解:

Java Web之HttpSession详解


JavaWeb核心之HttpSession

实现HttpSession


session.setAttribute()和session.getAttribute()的使用


设置登录状态步骤:

  1. 连接上服务器为默认匿名游客session态,返回前端
  2. 登录成功后,得到成功登录session态存储带有信息值,并给予前端设置cookie命令
  3. 前端接收命令后,设置cookie
  4. 前端请求后端时,带上cookie
  5. 后端通过cookie,找到session
  6. 后端基于session存储该用户脱敏信息


设置session:

httpReq.getSession()//获取Session
.setAttribute("user",user);//放入Session记录状态

这里“user”设置为常量更好



6. 对于序列化Serializable


什么是序列化:

把对象转换为字节序列的过程称为对象的序列化。

把字节序列恢复为对象的过程称为对象的反序列化。


为什么要生成一个序列号uid:

为什么实现了Serializable接口还要指定serialVersionUID值呢

【总结】指定序列号uid为了反序列化从硬盘恢复到内存时能保持正常


还有右键找不到生成序列号uid快捷键的解决方法:

Intellij IDEA用快捷键自动生成序列化id



7. 编写完成后接口的测试


我是使用Apipost软件去测试的



对于Post请求:主要将参数放入请求体内,没有JSON化的直接Body传入即可


对于Get请求:是将参数放入url内进行请求,要在Body中指定参数进行的传递


对于Cookie则在请求头中进行传递


快速上手 | Apipost






报错大合集



先放炎佬的笔记:知识星球

还有其他的笔记汇总入口:用户中心项目-笔记汇总 (zsxq.com)



我自己碰见的


1.导入Mybaits Plus然后测试引用后按照官方样例测试报错

报错:java.lang.IllegalStateException: Failed to load ApplicationContext

解决方法:重启spring

分析是Mybaits和Mybaits Plus版本冲突,其实不需要修改版本



2.报错:Error creating bean with name 'userMapper' defined in file/项目文件名爆红

解决:最好不要直接移动代码生成的包和类到项目,通过手动创建软件包再复制粘贴项目,修改导入的类路径,就可以避免。



3.一般版本冲突解决方法:



不知为何再次出现前面相同错误,这回确定是Mybatis和Mybatis Plus版本问题了。


解决方法:

使用Maven Helper插件排除冲突


打开pom.xml,点击下方的Dependency Analyzer


对冲突解决,右击低版本依赖,选择Exclude排除




4.报错空指针异常:


解决方法:加Resource注解注入

@Resource
UserServiceImpl userService = new UserServiceImpl();


5.尝试使用不兼容的返回值类型

报错:extends ServiceImpl 'com.baomidou.mybatisplus.extension.service.impl.ServiceImpl' 中的 'getBaseMapper()' 与 'com.baomidou.mybatisplus.extension.service.IService' 中的 'getBaseMapper()' 冲突;

解决方法:未修改代码生成器导入的实体类,仔细查看一下文件导入,修改一下导入即可


6.查询数据库出错



解决方法:修改一下未对应的表名或者其他为未对应内容


(数据库不是必须填入字段,设计表时一定要加上默认NULL填充,不然插入数据没有进行处理会报错。)



7.MyBatis和MyBatis-Plus依赖冲突

会呈现两种形式的报错


解决方法:依旧是MyBatis和MyBatis-Plus依赖冲突,这也是同时解决上面报错1和3的最终解决办法。这两个依赖最好不要同时导入,因为是按照鱼皮idea相同方法构建的,直接把所有MyBatis去掉即可。为了排除这个错误痛苦好久,卡了我大半天,快难受死了,尝试各种方法,最后发现只需要把MyBatis依赖去掉就可以解决问题。导入了MyBatis-Plus就不要再导入MyBatis了,血泪的教训。


当然,只引入MyBatis也一样可能会出现这个错误,具体参考下面这个文章


Springboot整合Mybatis报错大集合



下面其余🐟友发星球里的,在笔记或者其余地方的就只能大家自己去查找了:



8.



9.


10.


11.


12.


13.




14.

Springbot启动报错-类文件具有错误的版本 61.0, 应为 52.0_/d:/java/apache-maven-3.8.6/repository/org/springf-CSDN博客


15.


16.


17.


18.


19.


20.



21.



22.


23.


24.


23年之后的大概筛选了一遍,没有具体解决方法,内容重复的都去掉了,还可能有遗漏的帖子,剩下靠大伙补充了。


0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
鱼友6403
下载 APP