ClassCastException 无法转换为 class X 和 Y 在加载器的未命名模块中 'app'
ClassCastException cannot be cast to class X and Y are in unnamed module of loader 'app'
我有一个名为 ControllerConfiguration
的 class,我将这两个 bean 添加到 ApplicationContext:
@Bean
@Lazy
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public ConnectorFittingController connectorFittingController() throws IOException {
return loadController(ConnectorFittingController.class);
}
@Bean
@Lazy
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public ConnectorFittingResultController connectorFittingResultController() throws IOException {
return loadController(ConnectorFittingResultController.class);
}
现在抛出以下异常:
Caused by: java.lang.ClassCastException: class de.some.project.controller.connectorfitting.ConnectorFittingResultController cannot be cast to class de.some.project.controller.connectedconnectors.ConnectedConnectorsController (de.some.project.controller.connectorfitting.ConnectorFittingResultController and de.some.project.controller.connectedconnectors.ConnectedConnectorsController are in unnamed module of loader 'app')
at de.some.project.controller.ControllerConfiguration.connectedConnectorsController(ControllerConfiguration.java:156)
at de.some.project.controller.ControllerConfiguration$$EnhancerBySpringCGLIB$a944412.CGLIB$connectedConnectorsController(<generated>)
at de.some.project.controller.ControllerConfiguration$$EnhancerBySpringCGLIB$a944412$$FastClassBySpringCGLIB$aa65ce.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331)
at de.some.project.controller.ControllerConfiguration$$EnhancerBySpringCGLIB$a944412.connectedConnectorsController(<generated>)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
... 62 more
这没有任何意义,因为我从来没有在任何地方尝试转换为这些 classes 之一。
我在其他问题中读到这与 spring 开发人员工具有关。但是我没有在我的项目中使用它们。
这是我的 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.6</version>
</parent>
<groupId>private.company</groupId>
<artifactId>projectname</artifactId>
<version>0.0.32</version>
<name>project</name>
<description></description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>net.harawata</groupId>
<artifactId>appdirs</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jfoenix</groupId>
<artifactId>jfoenix</artifactId>
<version>8.0.10</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<!-- Logging utilities -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</dependency>
<dependency>
<groupId>org.controlsfx</groupId>
<artifactId>controlsfx</artifactId>
<version>11.1.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testfx</groupId>
<artifactId>testfx-junit5</artifactId>
<version>4.0.16-alpha</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.1.0</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
编辑:
这是loadController
方法。
/**
* Uses {@link FXMLLoader} to load the view for a presenter. The FXML file name
* is derived from the class name. The presenters root is set to the loader's
* root. If a similarly named CSS file exists, it is added to the presenters
* style sheets. The resource bundle is set using the same derived name.
*
* @param clazz The Presenter class to load the FXML for.
* @return The Presenter, i.e. the views controller.
*
* @throws IOException If the XML file can't be loaded.
*/
protected <C extends AbstractHarconController<T>, T extends Parent> C loadController(Class<C> clazz)
throws IOException {
String derivedXmlName = deriveXMLName(clazz);
try (InputStream fxmlStream = Thread.currentThread().getContextClassLoader()
.getResourceAsStream(derivedXmlName)) {
LOGGER.info("DerivedXMLName: {}", derivedXmlName);
FXMLLoader loader = new FXMLLoader();
try {
loader.setResources(ResourceBundle.getBundle(deriveBundleName(clazz)));
} catch (MissingResourceException mre) {
// Missing resource is ok, only log it for tracability, continue as normal
LOGGER.trace("Unable to load resource bundle for {}: {}", deriveBundleName(clazz), mre.getMessage());
LOGGER.trace("", mre);
} // try
loader.load(fxmlStream);
addCSSIfAvailable(loader.getRoot(), clazz);
return loader.getController();
} // try
}
正如您在 Stack Trace 中看到的那样,错误来自这个地方
de.some.project.controller.ControllerConfiguration.connectedConnectorsController(ControllerConfiguration.java:156)
我认为您指的是错误的地方。
实际上错误说您尝试在 ControllerConfiguration.java:156 处将 ConnectorFittingResultController class 转换为 ConnectedConnectorsController class
请检查这一点。
问题是我在相应的 FXML 文件中定义了错误的控制器...
谢谢大家!
我有一个名为 ControllerConfiguration
的 class,我将这两个 bean 添加到 ApplicationContext:
@Bean
@Lazy
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public ConnectorFittingController connectorFittingController() throws IOException {
return loadController(ConnectorFittingController.class);
}
@Bean
@Lazy
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public ConnectorFittingResultController connectorFittingResultController() throws IOException {
return loadController(ConnectorFittingResultController.class);
}
现在抛出以下异常:
Caused by: java.lang.ClassCastException: class de.some.project.controller.connectorfitting.ConnectorFittingResultController cannot be cast to class de.some.project.controller.connectedconnectors.ConnectedConnectorsController (de.some.project.controller.connectorfitting.ConnectorFittingResultController and de.some.project.controller.connectedconnectors.ConnectedConnectorsController are in unnamed module of loader 'app')
at de.some.project.controller.ControllerConfiguration.connectedConnectorsController(ControllerConfiguration.java:156)
at de.some.project.controller.ControllerConfiguration$$EnhancerBySpringCGLIB$a944412.CGLIB$connectedConnectorsController(<generated>)
at de.some.project.controller.ControllerConfiguration$$EnhancerBySpringCGLIB$a944412$$FastClassBySpringCGLIB$aa65ce.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331)
at de.some.project.controller.ControllerConfiguration$$EnhancerBySpringCGLIB$a944412.connectedConnectorsController(<generated>)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
... 62 more
这没有任何意义,因为我从来没有在任何地方尝试转换为这些 classes 之一。 我在其他问题中读到这与 spring 开发人员工具有关。但是我没有在我的项目中使用它们。
这是我的 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.6</version>
</parent>
<groupId>private.company</groupId>
<artifactId>projectname</artifactId>
<version>0.0.32</version>
<name>project</name>
<description></description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>net.harawata</groupId>
<artifactId>appdirs</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jfoenix</groupId>
<artifactId>jfoenix</artifactId>
<version>8.0.10</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<!-- Logging utilities -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</dependency>
<dependency>
<groupId>org.controlsfx</groupId>
<artifactId>controlsfx</artifactId>
<version>11.1.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testfx</groupId>
<artifactId>testfx-junit5</artifactId>
<version>4.0.16-alpha</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.1.0</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
编辑:
这是loadController
方法。
/**
* Uses {@link FXMLLoader} to load the view for a presenter. The FXML file name
* is derived from the class name. The presenters root is set to the loader's
* root. If a similarly named CSS file exists, it is added to the presenters
* style sheets. The resource bundle is set using the same derived name.
*
* @param clazz The Presenter class to load the FXML for.
* @return The Presenter, i.e. the views controller.
*
* @throws IOException If the XML file can't be loaded.
*/
protected <C extends AbstractHarconController<T>, T extends Parent> C loadController(Class<C> clazz)
throws IOException {
String derivedXmlName = deriveXMLName(clazz);
try (InputStream fxmlStream = Thread.currentThread().getContextClassLoader()
.getResourceAsStream(derivedXmlName)) {
LOGGER.info("DerivedXMLName: {}", derivedXmlName);
FXMLLoader loader = new FXMLLoader();
try {
loader.setResources(ResourceBundle.getBundle(deriveBundleName(clazz)));
} catch (MissingResourceException mre) {
// Missing resource is ok, only log it for tracability, continue as normal
LOGGER.trace("Unable to load resource bundle for {}: {}", deriveBundleName(clazz), mre.getMessage());
LOGGER.trace("", mre);
} // try
loader.load(fxmlStream);
addCSSIfAvailable(loader.getRoot(), clazz);
return loader.getController();
} // try
}
正如您在 Stack Trace 中看到的那样,错误来自这个地方 de.some.project.controller.ControllerConfiguration.connectedConnectorsController(ControllerConfiguration.java:156)
我认为您指的是错误的地方。 实际上错误说您尝试在 ControllerConfiguration.java:156 处将 ConnectorFittingResultController class 转换为 ConnectedConnectorsController class 请检查这一点。
问题是我在相应的 FXML 文件中定义了错误的控制器...
谢谢大家!