我最近遇到了這個問題,在搜索了 stackoverflow 站點后,找不到有效的解決方案。我得到的錯誤是 Spring 在加載配置類時遇到問題。我使用注釋和 Spring 類來配置,而不是 XML 檔案,來練習使用注釋而不是 XML 檔案來配置 Java 應用程式。
我已經仔細檢查以確保所需的注釋在那里,并且 Spring 組態檔被標記為,@Configuration并且組態檔中的所有 bean 都被標記為@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 檔案:
Dao 類(不是真正訪問資料庫,只是練習使用 Spring Annotations 而不是 XML 檔案進行配置):
package com.spring;
import org.springframework.stereotype.Component;
@Component
public class Dao {
public void create() {
System.out.println("Created");
}
}
彈簧配置類:
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
uj5u.com熱心網友回復:
前言
這個問題實際上與我在這里一般回答的問題非常相似,除此之外,我還描述了他在此處回答中提到的--add-opens解決方法@victoraugustofd 。
但是因為另一個答案不包含MCVE而這個包含,所以這個問題實際上最好不僅以通用的方式回答,而且以更具體的方式回答,因為未來的每個讀者都可以看到代碼和 POM 以便重現問題和解決方案。這是我們在 Stack Overflow 上想要的那種問題。??
問題根源
就像我在另一個答案中所說的那樣,問題是自 JDK 16 以來JEP 396限制了對內部 JDK 類的訪問。這兩個問題之間的區別在于,當 CGLIB 嘗試訪問 JDK 類時,另一個問題會出現問題。然而,問題在于嵌入在更過時的 Spring Core 版本中的舊 ASM 版本。
解決方案
因此,如果您想避免打開包的解決方法,只需升級到包含更新的 ASM 的更新的 Spring 版本。對于 4.3.x,沒有這樣的更新,對于 5.0.x 也沒有。但是,如果您可以升級到 5.1.20、5.2.19 或 5.3.16,那么您的示例應用程式可以在 JDK 16 上運行。可能會有稍舊的次要版本包含合適的 ASM 版本,但是如果您仍然升級又何必麻煩呢?只需使用 5.1、5.2 或 5.3 的最新次要-次要版本。
uj5u.com熱心網友回復:
從 Java 9 開始,Java 引入了模塊和一些框架,如 Spring,依賴于幾種反射行為,并且由于模塊化,一些類的屬性無法通過反射訪問。解決方案是更改這些屬性的可訪問性,但這樣做需要很長時間。
真正的解決方案是在運行應用程式時添加此 VM 選項:--add-opens java.base/java.lang=ALL-UNNAMED
請在另一個有類似問題的帖子上參考這個很好的答案: 回答類似問題
我將您的應用程式更改為使用 Spring Boot,您是否考慮使用它?對于 Spring 應用程式,它是一個非常方便的解決方案,因為它抽象了許多配置。這是一個帶有詳細示例的鏈接:Spring Boot Example
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/435140.html
標籤:爪哇 春天 注释 奥普 spring-aop
上一篇:使用SpringSecurity的用戶和用戶角色之間的外鍵
下一篇:在發送到頁面之前轉換欄位
