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 文件中定义了错误的控制器...

谢谢大家!