Spring Boot问题汇总三
1.Cannot find class
这个问题真的很奇怪,路径上明明有这个文件,但是实际上总是提示找不到类。 Failed to parse mapping resource,Cannot find class: org.jeecg.modules.quartz.entity.QuartzJob
【尝试方案】
(1)修改启动类,把该尝试的方法都尝试了,一个* ,还是两个 *,都不起作用
1 |
(2)编辑 pom.xml
在pom.xml中增加了一些配置,其实加不加的都可以了,也没有什么用。
1 | <bulid> |
【解决方案】
最后解决方案竟然是我配置文件写错了,因为我在 mapper-locations 中多加了一个 * 号,真是浪费了我很多的时间。但是奇怪就奇怪在这,因为 classpath* 本来就是可以用的,但是到我这里,就不能用了。
1 | # 错误 |
【1】.Failed to parse mapping resource…… 其实报错信息里提示的很清楚,在这个XML文件中31行,14列有错误,导致XML文件无法解析,从而spring容器初始化失败。。
【2】.SpringBoot多模块项目如何扫描全局mapper接口和mapper.xml文件 mapper.xml文件的路劲配置是否正确,classpath指的是resources目录,如果不在resources目录下,注意正确配置路劲。
【3】.springboot+mybatis报错找不到实体类
【4】.spring mybatis - Failed to parse mapping resource
【5】.org.springframework.core.NestedIOException: Failed to parse mapping resource: ‘file [XXX.xml]’;报错问题
【6】.SpringBoot多模块项目如何扫描全局mapper接口和mapper.xml文件 1.主启动类配置 在类名上加上如下注解;2.application.properties文件配置;3.3.pom.xml
2.Error creating bean with name ‘serverEndpointExporter’ defined in class path resource [org/jeecg/config/WebSocketConfig.class]: jakarta.websocket.server.ServerContainer not available
这个问题也是挺莫名其妙的,就是运行不起来,然后我最后还是定位到了版本依赖的问题。
【尝试方案】
我看了几篇文章,然后配置了 websocket 和 springboot test, 结果没有用。
1 | <dependency> |
【解决方案】
最后的解决方案,就是依赖的版本冲突,我把子模块的 spring-boot-starter-websocket 删除了,然后重新修改了部分的代码,这才算好了。
【1】.javax.websocket.server.ServerContainer not available
【2】.SpringBoot项目测试类报错: Error creating bean with name ‘serverEndpointExporter’ defined in class path resource … 在SpringBootTest注解中添加webEnvironment配置:
【3】.Java jakarta.websocket.server.ServerContainer not available(已解决) 测试类的注解增加 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
【4】.SpringBoot启动测试时报错(javax.websocket.server.ServerContainer not available) 得知SpringBootTest在启动的时候不会启动服务器,所以WebSocket自然会报错,这个时候需要添加选项webEnvironment,以便提供一个测试的web环境。如下:
3.java.lang.NoClassDefFoundError: Could not initialize class com.dji.sdk.cloudapi.device.DeviceOsdWsResponse
这个问题也很头疼,就是明明有这个类,也有这个包,就是会提示这个错误。
【尝试方案】
(1)我尝试了几个依赖的增加,也没有什么头绪,只能胡乱的测试。
(2)尝试找到 ExceptionInInitializerError 这个问题的出现,找到了这个错误:Unable to create a Configuration, because no Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath,找到了错误:Can not set java.lang.Long field com.dji.sample.manage.model.entity.DeviceEntity.updateTime to java.util.Date
(3)尝试找到了一个可能的问题,主要就是数据库字段的对应上。问题就出在了这个 updateTime 上,数据库部分表用了 bigint ,有些表用了 datetime,所以导致了问题。我因为用了 jeecgboot 框架,也就把原先的 create_time 和 update_time 列删掉了,然后新建了 datetime 类型的列。
【解决方案】
经过尝试,我还是落脚在了这个 BaseModel 上了,原先的问题是使用了 javax 里面的库,因为我用的是springboot3,于是我都换成 jakarta 这个库。
1 | // 原先问题 |
【1】.java.lang.NoClassDefFoundError: Could not initialize class XXX
【2】.3 ways to solve java.lang.NoClassDefFoundError in Java J2EE
【3】.java.lang.NoClassDefFoundError: Could not initialize class xxx
【4】.java.lang.NoClassDefFoundError: Could not initialize class xxx 原因及解决方法 由于测试是多次失败后, 把NoClassDefFoundError 异常发给我, 所以追踪异常出现问题, 只有找到 ExceptionInInitializerError 的整个错误栈才能找到真正的原因,解决方案:1. install所属模块;2.查看错误栈, 是不是这个类启动项目初始化失败了
【5】.java.lang.NoClassDefFoundError: Could not initialize class xxx 原因及解决方法 JVM在加载类的时候,会初始化类里的静态变量,或执行静态块,如果这个时候抛出了异常,该类就会加载失败,那么以后任何使用到这个类的地方,都会抛出NoClassDefFoundError异常
【6】.OpenApi Spring 3 NoProviderFoundException 这里是用了 Sprindocs’ OpenApi 这个东西,给我了一个启发。
4.Method does not override method from its superclass
这里的 @Overrde 总是报错,提示没有实现相关的方法。
1 | public class AuthInterceptor implements HandlerInterceptor { |
【解决方案】
这里的解决方案,主要是因为类型不同导致的。我用了springboot3.x,这里的 preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) 的 HttpServletRequest 是 jakarta.servlet.http 包下的,而不是 javax.servlet.http 包下的。
【1】.IDEA中@override注解报错信息“Method does not override method from its superclass” !!!首先查看这个方法是不是重载父类的方法,如果没有父类,那么使用了@override一定会报错;!!!查看重载时是不是方法名/参数有区别;
【2】.SpringBoot3-实现和注册拦截器
【3】.A method does not override a method in its superclass
【4】.Spring MVC学习(8)—HandlerInterceptor处理器拦截器机制全解
5.Could not load store from ‘classpath:keystore.jks’
在我本地测试 https 或者 wss,就需要先配置,不用通过 nginx 等工具。
(1) 生成签名
1 | keytool -genkeypair -alias tomcat -keyalg RSA -keystore D:\keystore.jks |
(3) 配置
1 | server: |
我放到了 resources 路径下,然后配置了 ssl.key-store: classpath:keystore.jks,但是就是显示上面的问题。
1 | <resources> |
【解决方案】
最后我只能把 classpath 换成了绝对路径 D:\keystore.jks,这样才找到了这个 jks 文件。
【1】.Springboot整合Websocket实现ws和wss连接 这里主要通过 nginx 进行配置。
【2】.springboot+websocket+ssl 首先你需要生成一个ssl认证证书,操作完第一步之后会生成一个keystore.p12文件将这个文件放到你项目的源路径下,在application.properties中添加
【3】.SpringBoot 配置基于 wss 和 STOMP 的 WebSocket 1.生成签名证书;2.项目配置;
【4】.boot不能加载keystore文件 明明是加入到时类路径,但却没有加载,于是到编译生成的target\class去找auth.keystore文件,发现确实没有这个文件,那么就是在编译的时候将这个auth.keystore文件排除了。但是工程的pom文件插件中只有 spring-boot-maven-plugin,难道是这个插件过滤了吗?
【5】.Could not load key store ‘classpath:keystore.p12‘
【6】.Could not load key store ‘classpath:*.jks‘ https://blog.csdn.net/xioxiwang/article/details/141233984
6.升级Spring的版本
为了解决 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38819)漏洞,我只能升级 Spring 版本,但是我用的是Spring Boot 2.7.18,已经是到顶了,没办法升级了,只能换一种方式了。
【解决方案】
1 | <spring-framework.version>6.1.14</spring-framework.version> |
【1】.如何升级spring boot中spring框架的版本 那么我们直接在项目顶层的pom.xml文件中自己定义覆盖<spring-framework.version>5.3.29</spring-framework.version>该属性即可。
【2】.CVE-2024-38819 POC Spring路径遍历漏洞
【3】.Spring Boot 2.x 到 3.2 的升级指南
7.Factory method ‘sqlSessionFactory’ threw exception with message: com/alibaba/fastjson2/util/Wrapper
我把代码从老的项目中拷贝到新的项目中,结果就报了这个错误。
【解决方案】
解决方案就是安装了 Maven Helper,然后找到了 fastjson 冲突的包,然后执行了排除操作。
【1】.解决冲突 这里找了方案。