ApplicationStartedEvent cannot be cast to ApplicationEnvironmentPreparedEvent

SpringBoot ClassCastException 解决方案

SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
Exception in thread "main" java.lang.ClassCastException: org.springframework.boot.context.event.ApplicationStartedEvent cannot be cast to org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent
    at org.springframework.boot.context.config.AnsiOutputApplicationListener.onApplicationEvent(AnsiOutputApplicationListener.java:34)
    at org.springframework.context.event.SimpleApplicationEventMulticaster$1.run(SimpleApplicationEventMulticaster.java:78)
    at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:76)
    at org.springframework.boot.context.event.EventPublishingRunListener.started(EventPublishingRunListener.java:67)
    at org.springframework.boot.SpringApplicationRunListeners.started(SpringApplicationRunListeners.java:48)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:305)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1187)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1176)
    at hello.MainController.main(MainController.java:14)

原因:SpringBoot版本问题

排查方法

通过mvn依赖树分析,查看具体的依赖是否有 spring 2.5.6

排除掉对应的包即可:

<exclusions>
  <exclusion>
     <groupId>org.springframework</groupId>
     <artifactId>spring</artifactId>
  </exclusion>
</exclusions>

不同类型的`cannot be cast to`错误有不同的解决方法: - **从redis中取值出现`xxx cannot be cast to xxx`错误**:文档未给出具体解决步骤,但出现此错误可能是因为从Redis中取出的数据类型与代码中期望的数据类型不匹配,需要检查Redis中存储的数据类型和代码中接收数据的类型是否一致,确保类型兼容 [^1]。 - **用TreeSet集合存储自定义对象,出现`Comparable_Demo.Student cannot be cast to java.lang.Comparable`错误**:使用TreeSet集合存储自定义对象时,无参构造方法通过自然排序对元素进行排序,需要让元素所属的类实现`Comparable`接口,并重写`compareTo(T o)`方法。示例代码如下: ```java public class Student implements Comparable<Student> { private int age; private String name; public Student() {} public Student(int age, String name) { this.name = name; this.age = age; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student [age=" + age + ", name=" + name + "]"; } @Override public int compareTo(Student s) { int num = this.age - s.age; // 升序 int num1 = num == 0 ? this.name.compareTo(s.name) : num; return num; } } ``` 通过上述代码让`Student`类实现`Comparable`接口并实现相应方法,即可解决该错误 [^2]。 - **使用`request.getParameterMap()`出现`[Ljava.lang.String; cannot be cast to java.lang.String`错误**:`request.getParameterMap().get(key)`返回的是`String[]`类型,若将其直接转换为`String`类型会报错。解决办法是将其作为字符串数组处理,使用`((String[])map.get(aaa))[0]`来获取数组中的第一个元素。示例代码如下: ```java Map map = hrequest.getParameterMap(); Set key = map.keySet(); for (Object aaa : key.toArray()) { parakey = aaa.toString(); paravalue = ((String[]) map.get(aaa))[0]; requestpath = requestpath + "?" + parakey + "=" + paravalue; } ``` 通过这种方式可以避免类型转换错误 [^3]。 - **`java.lang.Integer cannot be cast to java.lang.Long`错误**:文档未给出具体解决步骤,出现此错误是因为尝试将`Integer`类型的数据强制转换为`Long`类型。可以使用`Long.valueOf(intValue)`方法将`Integer`类型转换为`Long`类型,避免强制类型转换错误 [^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVA程序哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值