Java 类强制转换异常 - 春季启动

Posted

技术标签:

【中文标题】Java 类强制转换异常 - 春季启动【英文标题】:Java Class cast Exception - Spring boot 【发布时间】:2019-02-22 10:23:39 【问题描述】:

线程“主”java.lang.ClassCastException 中的异常: java.base/jdk.internal.loader.ClassLoaders$AppClassLoader 不能 转换为 java.base/java.net.URLClassLoader 在 org.springframework.boot.devtools.restart.DefaultRestartInitializer.getUrls(DefaultRestartInitializer.java:93) 在 org.springframework.boot.devtools.restart.DefaultRestartInitializer.getInitialUrls(DefaultRestartInitializer.java:56) 在 org.springframework.boot.devtools.restart.Restarter.(Restarter.java:138) 在 org.springframework.boot.devtools.restart.Restarter.initialize(Restarter.java:537) 在 org.springframework.boot.devtools.restart.RestartApplicationListener.onApplicationStartedEvent(RestartApplicationListener.java:68) 在 org.springframework.boot.devtools.restart.RestartApplicationListener.onApplicationEvent(RestartApplicationListener.java:45) 在 org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:166) 在 org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:138) 在 org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:121) 在 org.springframework.boot.context.event.EventPublishingRunListener.started(EventPublishingRunListener.java:63) 在 org.springframework.boot.SpringApplicationRunListeners.started(SpringApplicationRunListeners.java:48) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:304) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1186) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1175) 在 com.rme.hub.RmeApplication.main(RmeApplication.java:24)

【问题讨论】:

您的问题能具体一点吗? 只有堆栈跟踪是无法回答的。分享你的代码会让事情变得更容易 尽管偏离了规则、cmets 和问题的结束,但对于处于相同情况的人来说,问题是明确的。谢谢作者! 【参考方案1】:

根据堆栈跟踪中java.base/jdk.internal.loader.ClassLoaders 的存在判断,您使用的是Java 9 或更高版本。 Spring Boot 的 DefaultRestartInitializer 正在尝试将应用程序类加载器转换为 URLClassLoader。这适用于 Java 8 及更早版本,但不适用于 Java 9 或更高版本。 Spring Boot 在 2.0 中一直是 updated 以应对 Java 9 中的这种变化。

如果你想在 Java 9 或更高版本中使用 Spring Boot,你应该升级到 Spring Boot 2。在撰写本文时,最新版本是 2.0.5,它支持 Java 8、9 和 10。Spring Boot 2.1将于今年晚些时候发布,它将增加对 Java 11 的支持。

【讨论】:

描述:com.rme.hub.service.UserService 中的字段 userRepo 需要一个名为“entityManagerFactory”的 bean,但无法找到。行动:考虑在您的配置中定义一个名为“entityManagerFactory”的bean。 这似乎是一个完全不相关的错误。如果这个问题让您取得了一些进展,那么我建议您继续并提出另一个问题。如果您继续问另一个问题,我还建议您先阅读并根据this advice 采取行动。 我正在使用 SpringBoot4 和 jdk11。但我仍然遇到同样的错误。当我从 pom.xml 中注释掉 DevTools 时。然后它的工作。为什么我不能在这里使用 devtools? @SritamJagadev 我猜 SpringBoot4 是错字?在撰写本文时,最新版本是 2.1.3。您需要使用 2.0 或更高版本才能使用 Java 9 或更高版本。 Spring Boot 2.1 中正式添加了对 JDK 11 的支持。 这在 Intellij 中对我有用,并设置编辑我的构建以使用较旧的 Java 版本(Java 8)并且构建工作正常。【参考方案2】:

我在 eclipse 上遇到了这个问题,并通过执行以下步骤解决了:

先下载java 8(如果没有)再安装 其次,我不确定你是否必须这样做,但只是去做。我通过右键单击桌面创建 JAVA_HOME 路径 -> 属性 -> 高级系统设置 -> 高级选项卡 -> 环境变量 -> 在用户变量和系统变量中添加 JAVA_HOME -> 单击新建 -> 变量主页是“JAVA_HOME”,变量值可以留空 -> 浏览目录 -> 指向你的 jdk 文件夹(例如:我的是 C:\Program Files\Java\jdk1.8.0_291) 三,进入eclipse -> 进入window tab -> 在左侧菜单中选择java -> Installed JREs -> in default eclipse has had jre directory -> 点击它然后点击duplicate -> change目录到您自己的 jre 目录(例如:C:\Program Files\Java\jre1.8.0_291) 第四:返回java菜单,选择编译器选项->然后在右侧->将编译器合规级别更改为1.8。

就是这样! 希望对你有用。

【讨论】:

【参考方案3】:

解决方案:在 IDE 中更改 JDK 版本 8



我在 IntelliJ idea 和 sts 的 spring boot 应用程序中遇到了同样的问题,但我在该问题中找到了一个解决方案:

如果您在项目中使用 AD 集成,它属于 Microsoft,那么您需要使用 java 8 版本的 JDK,因为目前 Microsoft AD 插件不支持 java 9 或更高版本,它将仅支持 java 8 或更低版本版本

【讨论】:

以上是关于Java 类强制转换异常 - 春季启动的主要内容,如果未能解决你的问题,请参考以下文章

java的异常体系

Java强制类型转换异常

java 里 可以把一个父类强制转换成一个子类 不能把一个子类强制转换成一个父类? 对吗?

java父类强制转换成子类的问题

java中怎样做可以把父类强制转换成子类

ForEach 方法中的类强制转换异常