SpringSecurity和MybatisPlus遇到的奇葩问题

        说说最近遇到的springsecurity和mybatisplus的各种很难排查的问题——

        首先是跟着b站教程去做了基于JWT和springsecurity的鉴权系统,然后无论看多少个教程换多少种实现方式,只要你用的是最新的springboot和springsecurity,你就会发现这样一个问题,那就是你在鉴权成功后,访问任意不存在的路由都会得到401鉴权错误和一个顶部登陆弹窗,你打开调试会发现任何地方都没有报错,但容器就是会返回401而不是404,捕捉到的异常在某个地方就消失了,没有办法继续追踪到后面的错误位置。

        如果你很确定自己鉴权成功了,但仍然这样,那么恭喜你,你代码没错,但你这已经是无法通过修改代码解决的问题了。

我们在拦截器链中写了这样一个代码

http.csrf().disable()
.authorizeHttpRequests(
(authz) -> authz
.antMatchers(securityIgnoreUrl.getUrls()).permitAll()
.anyRequest().authenticated()
).httpBasic(withDefaults());
你会发现删除.httpBasic(withDefaults())后就没有这讨人厌的登陆弹窗了,但这并不会让这个问题得到解决,你在鉴权后访问不存在的路由仍然会返回403而不是404,后来问了很多专业做教程的从业人员也没人正确的回答这个问题是怎么产生的如何解决。

        最后我才发现了,这是springboot和security版本的问题,在3以上的版本它的整个鉴权是另一套东西,用2的实现方式就会出现这些莫名其妙的错误,所以最好的解决方法是换回2,代码不变就不出错了。但如果你想继续用3,那就去啃国外的文档,学习最新的一套鉴权体系是如何实现的即可,只是你已经写了的代码恐怕多半都不能用了。

        然后是奇怪的mybatisplus,一个是分页需要依赖插件,另一个是联表查询还得自己写@select之类无伤大雅的事情。但我最觉得蠢的是,我用@Data生成了getter和setter,我以为我自己写的构造方法也会被默认重写覆盖。但我写了一个东西之后我发现查询过程中会在应该null的位置出现别的字段的值,这困扰了我很久。结果呢,是因为我原本新建这个类就是自己手动拼接数据用来测试的,那时候写的构造函数没有删除,而且那个构造函数是不完整的,如果按顺序和数据类型进行插入值就会出现插入位置错误,进一步导致Mybatisplus查询之后直接调用了这个错误的构造函数。。。嗯,这可能有我80%的错误吧,但乱用构造函数还不提醒我的MybatisPlus就没有1%的错误么?!