Всем добрый день! У меня есть веб-приложение с весенней загрузкой, для которого я добавил переплетение времени загрузки, чтобы иметь возможность использовать аспекты AspectJ для неуправляемого компонента Spring, но после того, как это приложение не запустилось. Я просмотрел много тем, касающихся настройки плетения времени загрузки для не-пружинных бобов в весеннем проекте, но не встречал, сталкивался ли кто-нибудь с проблемой, с которой я столкнулся в настоящее время. Моя конфигурация:
градиентные зависимости:
dependencies {
compileOnly ("org.projectlombok:lombok:${lombokVersion}")
implementation("org.aspectj:aspectjweaver:1.9.9.1")
implementation ("org.mapstruct:mapstruct:${mapstructVersion}")
implementation("com.fasterxml.jackson.core:jackson-databind:2.14.0-rc1")
implementation ("mysql:mysql-connector-java:8.0.30")
implementation("org.opensearch.client:opensearch-java:2.1.0")
implementation("software.amazon.awssdk:apache-client:${awsSdkVersion}")
implementation("software.amazon.awssdk:regions:${awsSdkVersion}")
implementation("software.amazon.awssdk:auth:${awsSdkVersion}")
implementation("jakarta.json:jakarta.json-api:2.1.1")
implementation("commons-io:commons-io:2.11.0")
implementation ("org.springframework.boot:spring-boot-starter-web")
implementation ("org.springframework.boot:spring-boot-starter-data-jpa")
implementation ("org.springframework.boot:spring-boot-starter-security")
implementation ("org.springframework.boot:spring-boot-starter-validation")
implementation ("org.springframework.boot:spring-boot-starter-log4j2")
annotationProcessor ("org.projectlombok:lombok-mapstruct-binding:0.2.0")
annotationProcessor ("org.mapstruct:mapstruct-processor:${mapstructVersion}")
annotationProcessor ("org.projectlombok:lombok:${lombokVersion}")
testImplementation("org.testcontainers:mysql:1.17.5")
testImplementation ("org.springframework.boot:spring-boot-starter-test")
testImplementation("com.h2database:h2:2.1.214")
testCompileOnly("org.projectlombok:lombok:${lombokVersion}")
testAnnotationProcessor("org.projectlombok:lombok:${lombokVersion}")
}
Весенние загрузочные версии:
springBootVersion=2.7.4
dependencyManagement=1.0.14.RELEASE
Основной класс приложения:
@SuppressWarnings({"checkstyle:FinalClass", "checkstyle:HideUtilityClassConstructor"})
@SpringBootApplication
@EnableGlobalMethodSecurity(securedEnabled = true)
@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED)
@EnableCaching
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(WhiteCoatApp.class, args);
}
}
Аспект:
@Aspect
public class DefaultViewsReturnHandler {
@Around("viewObjects()")
public Object handle(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Do something");
return joinPoint.proceed();
}
@Pointcut("execution(* com.project.TestTest.getTestString(..))")
public void viewObjects() {}
}
Конфигурация META-INF/aop.xml
<aspectj>
<aspects>
<aspect name = "com.project.common.DefaultViewsReturnHandler"/>
</aspects>
<weaver options = "-verbose -showWeaveInfo">
<include within = "com.project..*"/>
</weaver>
</aspectj>
И сам класс, к которому я хотел бы применить аспект, - это простое pojo
public class TestTest {
private String testString;
public String getTestString() {
return "myString";
}
}
Я запускаю приложение с
-javaagent:libs/spring-instrument-6.0.0.jar
и джава 17
Но была ошибка:
[INFO ] 2022-11-17 18:49:51.009 [background-preinit] Version - HV000001: Hibernate Validator 6.2.5.Final
[INFO ] 2022-11-17 18:49:51.326 [main] RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode.
[INFO ] 2022-11-17 18:49:51.359 [main] RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 29 ms. Found 2 JPA repository interfaces.
[ERROR] 2022-11-17 18:49:51.454 [main] SpringApplication - Application run failed
java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.findLoadedClass(java.lang.String) accessible: module java.base does not "opens java.lang" to unnamed module @5dda768f
at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) ~[?:?]
at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) ~[?:?]
at java.lang.reflect.Method.checkCanSetAccessible(Method.java:199) ~[?:?]
at java.lang.reflect.Method.setAccessible(Method.java:193) ~[?:?]
at org.springframework.util.ReflectionUtils.makeAccessible(ReflectionUtils.java:577) ~[spring-core-5.3.23.jar:5.3.23]
at org.springframework.context.support.ContextTypeMatchClassLoader$ContextOverridingClassLoader.isEligibleForOverriding(ContextTypeMatchClassLoader.java:99) ~[spring-context-5.3.23.jar:5.3.23]
at org.springframework.core.OverridingClassLoader.loadClass(OverridingClassLoader.java:87) ~[spring-core-5.3.23.jar:5.3.23]
at java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[?:?]
at org.springframework.core.OverridingClassLoader.loadClass(OverridingClassLoader.java:82) ~[spring-core-5.3.23.jar:5.3.23]
at org.springframework.context.support.ContextTypeMatchClassLoader.loadClass(ContextTypeMatchClassLoader.java:70) ~[spring-context-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1594) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1534) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:704) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:674) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1670) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:570) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:542) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:221) ~[spring-context-5.3.23.jar:5.3.23]
at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:762) ~[spring-context-5.3.23.jar:5.3.23]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:567) ~[spring-context-5.3.23.jar:5.3.23]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.4.jar:2.7.4]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[spring-boot-2.7.4.jar:2.7.4]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.4.jar:2.7.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-2.7.4.jar:2.7.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.7.4.jar:2.7.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-2.7.4.jar:2.7.4]
at com.piecestech.whitecoat.platform.WhiteCoatApp.main(WhiteCoatApp.java:20) ~[main/:?]
[WARN ] 2022-11-17 18:49:51.465 [main] SpringApplication - Unable to close ApplicationContext
java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.findLoadedClass(java.lang.String) accessible: module java.base does not "opens java.lang" to unnamed module @5dda768f
at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) ~[?:?]
at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) ~[?:?]
at java.lang.reflect.Method.checkCanSetAccessible(Method.java:199) ~[?:?]
at java.lang.reflect.Method.setAccessible(Method.java:193) ~[?:?]
at org.springframework.util.ReflectionUtils.makeAccessible(ReflectionUtils.java:577) ~[spring-core-5.3.23.jar:5.3.23]
at org.springframework.context.support.ContextTypeMatchClassLoader$ContextOverridingClassLoader.isEligibleForOverriding(ContextTypeMatchClassLoader.java:99) ~[spring-context-5.3.23.jar:5.3.23]
at org.springframework.core.OverridingClassLoader.loadClass(OverridingClassLoader.java:87) ~[spring-core-5.3.23.jar:5.3.23]
at java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[?:?]
at org.springframework.core.OverridingClassLoader.loadClass(OverridingClassLoader.java:82) ~[spring-core-5.3.23.jar:5.3.23]
at org.springframework.context.support.ContextTypeMatchClassLoader.loadClass(ContextTypeMatchClassLoader.java:70) ~[spring-context-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1594) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1534) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:704) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:674) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1670) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:570) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:542) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:669) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:661) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1300) ~[spring-context-5.3.23.jar:5.3.23]
at org.springframework.boot.SpringApplication.getExitCodeFromMappedException(SpringApplication.java:867) ~[spring-boot-2.7.4.jar:2.7.4]
at org.springframework.boot.SpringApplication.getExitCodeFromException(SpringApplication.java:855) ~[spring-boot-2.7.4.jar:2.7.4]
at org.springframework.boot.SpringApplication.handleExitCode(SpringApplication.java:842) ~[spring-boot-2.7.4.jar:2.7.4]
at org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:782) ~[spring-boot-2.7.4.jar:2.7.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-2.7.4.jar:2.7.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.7.4.jar:2.7.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-2.7.4.jar:2.7.4]
at com.piecestech.whitecoat.platform.WhiteCoatApp.main(WhiteCoatApp.java:20) ~[main/:?]
Буду признателен за любые мысли по этому поводу!
В примечаниях к выпуску AspectJ вы можете прочитать следующее:
Используйте LTW на Java 16+
Обратите внимание, что если вы хотите использовать переплетение во время загрузки на Java 16+, агент переплетения сталкивается с JEP 396 (строгая инкапсуляция внутренних компонентов JDK по умолчанию) и соответствующими последующими JEP. Поэтому вам нужно установить параметр JVM
--add-opens java.base/java.lang=ALL-UNNAMED
, чтобы включить плетение аспектов. Это связано с тем, что вивер использует внутренние API, которым мы пока не нашли адекватной замены при определении классов в разных загрузчиках классов.