Spring Boot问题汇总三

标签: 无 分类: 未分类 创建时间:2024-06-27 14:25:03 更新时间:2024-11-15 10:49:43

1.Cannot find class

这个问题真的很奇怪,路径上明明有这个文件,但是实际上总是提示找不到类。 Failed to parse mapping resource,Cannot find class: org.jeecg.modules.quartz.entity.QuartzJob

【尝试方案】
(1)修改启动类,把该尝试的方法都尝试了,一个* ,还是两个 *,都不起作用

1
2
@ComponentScan(basePackages = {"com.dji.*","org.jeecg.*"})
@MapperScan(basePackages = {"org.jeecg.**.mapper","com.dji.sample.*.dao"})

(2)编辑 pom.xml
在pom.xml中增加了一些配置,其实加不加的都可以了,也没有什么用。

1
2
3
4
5
6
7
8
9
10
11
12
13
<bulid>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</bulid>

【解决方案】
最后解决方案竟然是我配置文件写错了,因为我在 mapper-locations 中多加了一个 * 号,真是浪费了我很多的时间。但是奇怪就奇怪在这,因为 classpath* 本来就是可以用的,但是到我这里,就不能用了。

1
2
3
4
5
6
# 错误
mybatis-plus:
mapper-locations: classpath*:org/jeecg/**/xml/*.xml
# 正确
mybatis-plus:
mapper-locations: classpath:org/jeecg/**/xml/*.xml
参考文章:
【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
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</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
2
3
4
5
6
7
8
9
// 原先问题
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;

// 改为
import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validation;
import jakarta.validation.Validator;
参考文章:
【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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class AuthInterceptor implements HandlerInterceptor {

public static final String PARAM_TOKEN = "X-Access-Token";

public static final String TOKEN_CLAIM = "customClaim";

@Override
public boolean preHandle(HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, Object handler) throws Exception {
String uri = request.getRequestURI();
log.info("request uri: {}, IP: {}", uri, request.getRemoteAddr());
// Put the custom data from the token into the request.
request.setAttribute(TOKEN_CLAIM, customClaimOpt.get());
return true;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// Delete the custom data in the request after the request ends.
request.removeAttribute(TOKEN_CLAIM);
}
}

【解决方案】
这里的解决方案,主要是因为类型不同导致的。我用了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处理器拦截器机制全解
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。