是什么导致Spring在使用AnnotationConfigApplicationContext时无法加载配置类?

2024-01-04

我最近遇到了这个问题,在搜索 stackoverflow 网站后,找不到可行的解决方案。我收到的错误是 Spring 在加载配置类时遇到问题。我使用注释和 Spring 类来配置(而不是 XML 文件),以练习使用注释而不是 XML 文件配置 Java 应用程序。

我已经仔细检查以确保所需的注释存在并且 Spring 配置文件标记为@Configuration以及配置文件中标记为的所有 bean@Bean。此外,特定的豆子还标有@Component.

创建测试类后,Spring 似乎仍然无法找到配置文件。我仔细检查了 pom 文件,看看是否缺少任何依赖项,但据我所知,似乎需要的依赖项就在那里。我不确定我还缺少什么,也不知道为什么 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="https://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.spring</groupId>
  <artifactId>Spring_JavaConfig</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <name>Spring_JavaConfig</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <springframework.version>4.3.6.RELEASE</springframework.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${springframework.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${springframework.version}</version>
    </dependency>
  </dependencies>
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.2</version>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

这是我的 Java 文件:

道类(并不是真正访问数据库,只是练习使用 Spring 注解而不是 XML 文件进行配置):

package com.spring;

import org.springframework.stereotype.Component;

@Component
public class Dao {
  public void create() {
    System.out.println("Created");
  }
}

Spring配置类:

package com.spring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringConfig {
  @Bean
  public Dao dao() {
    return new Dao();
  }
}

测试类:

package com.spring;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {
  public static void main(String[] args) {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
    Dao dao = context.getBean(Dao.class);
    dao.create();
    context.close();
  }
}

这是我收到的错误:

Feb 28, 2022 1:39:12 PM org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@39c0f4a: startup date [Mon Feb 28 13:39:12 EST 2022]; root of context hierarchy
Exception in thread "main" java.lang.IllegalStateException: Cannot load configuration class: com.spring.SpringConfig
at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:403)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanFactory(ConfigurationClassPostProcessor.java:249)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:281)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:125)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:686)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:524)
at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:84)
at com.spring.Test.main(Test.java:9)
Caused by: java.lang.ExceptionInInitializerError
at org.springframework.context.annotation.ConfigurationClassEnhancer.newEnhancer(ConfigurationClassEnhancer.java:119)
at org.springframework.context.annotation.ConfigurationClassEnhancer.enhance(ConfigurationClassEnhancer.java:107)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:393)
... 7 more
Caused by: java.lang.IllegalStateException: Unable to load cache item
at org.springframework.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:79)
at org.springframework.cglib.core.internal.LoadingCache.get(LoadingCache.java:34)
at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:116)
at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:291)
at org.springframework.cglib.core.KeyFactory$Generator.create(KeyFactory.java:221)
at org.springframework.cglib.core.KeyFactory.create(KeyFactory.java:174)
at org.springframework.cglib.core.KeyFactory.create(KeyFactory.java:153)
at org.springframework.cglib.proxy.Enhancer.<clinit>(Enhancer.java:73)
... 10 more
Caused by: java.lang.ExceptionInInitializerError
at org.springframework.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:243)
at org.springframework.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:329)
at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:93)
at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:91)
at org.springframework.cglib.core.internal.LoadingCache$2.call(LoadingCache.java:54)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at org.springframework.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61)
... 17 more
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @2f8f5f62
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)
at org.springframework.cglib.core.ReflectUtils$1.run(ReflectUtils.java:54)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
at org.springframework.cglib.core.ReflectUtils.<clinit>(ReflectUtils.java:44)
... 25 more

Preface

这个问题实际上和我一般回答的问题非常相似here https://stackoverflow.com/a/70965030/1082681,其中我还描述了--add-opens解决方法@victoraugustofd他在此处的回答中提到。

但因为另一个答案不包含MCVE https://stackoverflow.com/help/mcve这个问题确实如此,这个问题实际上最好不仅以通用的方式回答,而且以更具体的方式回答,因为将来的每个读者都可以看到代码和 POM,以便重现问题和解决方案。这就是我们希望在 Stack Overflow 上提出的问题。 ????

问题根本原因

正如我在另一个答案中所说,问题在于JEP 396 https://openjdk.java.net/jeps/396自 JDK 16 起限制对内部 JDK 类的访问。

Solution

因此,如果您想避免打开包的解决方法,只需升级到嵌入更新的 CGLIB 版本的更新的 Spring 版本即可。对于 4.3.x,没有此类更新,5.0.x 也没有。但如果你例如可以升级到 5.1.20、5.2.19 或 5.3.16,您的示例应用程序可在 JDK 16+ 上运行。可能有稍旧的次要版本包含合适的 CGLIB 版本,但如果您升级的话为什么还要麻烦呢?只需使用最新的次要版本 5.1、5.2 或 5.3。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是什么导致Spring在使用AnnotationConfigApplicationContext时无法加载配置类? 的相关文章

随机推荐

  • ReactJS:上传前预览多个图像

    我正在尝试在使用 ReactJS 将多个图像上传到服务器之前在浏览器中预览它们FileReader API 然而 我遇到的问题是每次我选择一些图像进行预览时 只显示最后一个图像 我的代码如下所示 class App extends Comp
  • jQuery 将光标设置为焦点上输入字段的开头

    我有一个输入字段
  • 为什么 hadoop 对于简单的 hello world 作业来说很慢

    我正在按照hadoop网站上的教程进行操作 https hadoop apache org docs r3 1 2 hadoop project dist hadoop common SingleCluster html https had
  • 在 Angular 2 中等待服务器对 http 请求的答复

    我的 Angular2 应用程序有一点问题 我想从服务器获取一些数据以供用户登录 但我的代码仍在继续 并且有很多错误 我想等待服务器的答复 然后对我的数据执行某些操作 这是我的代码 import Injectable from angula
  • Hive:在主表上进行增量更新的最佳方法

    所以我在 Hive 中有一个主表 它将存储我的所有数据 我希望能够每月加载增量数据更新 有大量数据 数十亿行 将会有新的数据 以及更新的条目 解决这个问题的最佳方法是什么 我知道 Hive 最近升级并支持更新 插入 删除 我一直在想的是以某
  • ASI 是什么意思? [复制]

    这个问题在这里已经有答案了 可能的重复 Javascript自动插入分号的规则是什么 https stackoverflow com questions 2846283 what are the rules for javascripts
  • 在 Xcode 4 中将文件添加到单独的目标

    自从升级到 xcode 4 以来 我找不到在哪里指定资源所属的 Target 以前 我选择了该文件并点击 command i 但现在这似乎是运行该程序 而不是调出该文件的信息框 Select the project file in the
  • 禁用 dc.js 中的交互性

    我有许多使用创建的条形图dc js 在默认行为中 用户可以单击并拖动其中任何一个来更新交叉过滤器 如何使图表 仅显示 也就是说 当其他组件更新交叉过滤器时 图表也会更新 但用户无法选择 仅显示 图表中的数据来更新交叉过滤器 None
  • 查询列定义的数据长度 - SQL Server

    我希望生成数据库的所有表 列和数据类型的列表 这个查询将为我提供除数据类型长度之外的所有信息 SELECT t name AS TableName c name AS ColumnName y name AS DataType FROM s
  • 为什么一个简单的 T-SQL UDF 函数会使代码执行速度慢 3 倍

    我正在重写一些旧的存储过程 并且在使用函数而不是内联代码时遇到了意外的性能问题 该功能非常简单如下 ALTER FUNCTION dbo GetDateDifferenceInDays first date SMALLDATETIME se
  • 是否有可能/如何获取特定 Facebook 群组成员的数量(即使数量超过 500 人)?

    我需要监控 Facebook 群组用户的数量并将其显示在网站上 我知道可以使用他们的 API 获取用户 ID 但仅限 500 个 如果会员总数超过 500 人 获取注册我建立的 Facebook 群组的成员总数的最简单方法是什么 这是可能吗
  • teamcity错误MSB4057:项目中不存在目标“pack”

    无法使用 4 7 框架为 Dot Net Core 项目创建包 我正在 teamcity 中使用 msbuild t pack p COnfiguration Release 命令来创建包
  • 从 JSON 类别中获取数据

    我正在编写一个应用程序 我在其中从 JSON 中获取数据 我能够获取类别列表但每当我点击任何类别时未获取产品列表始终在该特定类别下获取空白活动 JSON categoryId 1 categoryTitle SmartPhones Smar
  • User.IsInRole 返回 false

    我正在使用 Identity 2 在 mvc 5 网站中进行身份验证 在我看来 我想检查用户的角色 if User IsInRole Customers do something 但这总是返回 false 我已经设置了
  • 带有 Facebook 评论的自定义滚动条

    The goal 我想在窗口加载时运行滚动条脸书评论 容器 问题 滚动条工作得很好 但我必须resize屏幕强制其调用 场景 I made jsFiddle 上的示例 http jsfiddle net vDUyU 看一下 说明当前的情况
  • 用 C 生成所有元组 - 比嵌套循环更好的方法?

    我有一个数组double x 长度为 11 的函数f double x 我想找到函数的最小值f 通过离散化 所以对于给定的值val1 val2 valn我需要一个循环遍历 val 1 val n 11 中 x 的所有元组 我可以轻松地使用
  • C++ 概念占位符类型推导

    在范围规范中N4622 http www open std org jtc1 sc22 wg21 docs papers 2016 n4622 pdf the Same概念被定义为两种类型T and U 但有时在内部使用requires只有
  • 无法从 START_ARRAY 令牌中反序列化 java.util.HashMap 的实例

    我在使用 jackson core 2 7 3 jar 解析 JSON 时遇到问题 你可以从这里得到它们http repo1 maven org maven2 com fasterxml jackson core http repo1 ma
  • 在 C++11 中实现元函数 zip

    我实际上想看看是否可以获得一个最小的库 该库支持我从 boost fusion 使用的极少数操作 这是我到目前为止所拥有的 template lt typename Types gt struct typelist template lt
  • 是什么导致Spring在使用AnnotationConfigApplicationContext时无法加载配置类?

    我最近遇到了这个问题 在搜索 stackoverflow 网站后 找不到可行的解决方案 我收到的错误是 Spring 在加载配置类时遇到问题 我使用注释和 Spring 类来配置 而不是 XML 文件 以练习使用注释而不是 XML 文件配置