首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring本机运行时错误:可访问不支持的方法java.lang.Class.isSealed()

Spring本机运行时错误:可访问不支持的方法java.lang.Class.isSealed()
EN

Stack Overflow用户
提问于 2022-06-27 14:35:27
回答 1查看 198关注 0票数 2

我正在尝试执行由Spring原住民和Spring创建的本地映像。执行在/target目录中生成的应用程序会给出以下错误:

代码语言:javascript
复制
WARN 18883 --- [           main] w.s.c.ServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'methodValidationPostProcessor': Unexpected exception during bean creation; nested exception is com.oracle.svm.core.jdk.UnsupportedFeatureError: Unsupported method java.lang.Class.isSealed() is reachable: The declaring class of this element has been substituted, but this element is not present in the substitution class
ERROR 18883 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'methodValidationPostProcessor': Unexpected exception during bean creation; nested exception is com.oracle.svm.core.jdk.UnsupportedFeatureError: Unsupported method java.lang.Class.isSealed() is reachable: The declaring class of this element has been substituted, but this element is not present in the substitution class
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:555) ~[na:na]
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[na:na]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[na:na]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[na:na]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213) ~[na:na]
        at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:258) ~[na:na]
        at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:762) ~[na:na]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:567) ~[na:na]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[na:na]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[clea-ws-rest:2.7.0]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[clea-ws-rest:2.7.0]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[clea-ws-rest:2.7.0]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[clea-ws-rest:2.7.0]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[clea-ws-rest:2.7.0]
        at fr.gouv.clea.ws.CleaWsRestApplication.main(CleaWsRestApplication.java:11) ~[clea-ws-rest:0-SNAPSHOT]
Caused by: com.oracle.svm.core.jdk.UnsupportedFeatureError: Unsupported method java.lang.Class.isSealed() is reachable: The declaring class of this element has been substituted, but this element is not present in the substitution class
        at com.oracle.svm.core.util.VMError.unsupportedFeature(VMError.java:87) ~[na:na]
        at java.lang.Class.isSealed(DynamicHub.java:4563) ~[clea-ws-rest:na]
        at java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
        at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282) ~[na:na]
        at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:266) ~[na:na]
        at org.springframework.aop.framework.AopProxyUtils.completeProxiedInterfaces(AopProxyUtils.java:146) ~[na:na]
        at org.springframework.aop.framework.JdkDynamicAopProxy.<init>(JdkDynamicAopProxy.java:111) ~[na:na]
        at org.springframework.aop.framework.DefaultAopProxyFactory.createAopProxy(DefaultAopProxyFactory.java:55) ~[na:na]
        at org.springframework.aop.framework.ProxyCreatorSupport.createAopProxy(ProxyCreatorSupport.java:105) ~[na:na]
        at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110) ~[na:na]
        at org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver.buildLazyResolutionProxy(ContextAnnotationAutowireCandidateResolver.java:130) ~[na:na]
        at org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver.getLazyResolutionProxyIfNecessary(ContextAnnotationAutowireCandidateResolver.java:54) ~[na:na]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1306) ~[na:na]
        at org.springframework.aot.beans.factory.InjectedConstructionResolver.lambda$resolve$0(InjectedConstructionResolver.java:83) ~[na:na]
        at org.springframework.aot.beans.factory.InjectedConstructionResolver.resolveDependency(InjectedConstructionResolver.java:97) ~[na:na]
        at org.springframework.aot.beans.factory.InjectedConstructionResolver.resolve(InjectedConstructionResolver.java:83) ~[na:na]
        at org.springframework.aot.beans.factory.InjectedElementResolver.resolve(InjectedElementResolver.java:35) ~[na:na]
        at org.springframework.aot.beans.factory.InjectedElementResolver.create(InjectedElementResolver.java:66) ~[na:na]
        at org.springframework.aot.beans.factory.BeanDefinitionRegistrar$BeanInstanceContext.create(BeanDefinitionRegistrar.java:211) ~[na:na]
        at org.springframework.aot.ContextBootstrapInitializer.lambda$initialize$39(ContextBootstrapInitializer.java:378) ~[na:na]
        at org.springframework.aot.beans.factory.BeanDefinitionRegistrar$ThrowableFunction.apply(BeanDefinitionRegistrar.java:294) ~[na:na]
        at org.springframework.aot.beans.factory.BeanDefinitionRegistrar.lambda$instanceSupplier$0(BeanDefinitionRegistrar.java:115) ~[na:na]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1249) ~[na:na]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1191) ~[na:na]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[na:na]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[na:na]

我在我的pom.xml中使用以下依赖项:

代码语言:javascript
复制
       <dependency>
            <groupId>org.springframework.experimental</groupId>
            <artifactId>spring-native</artifactId>
            <version>0.12.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.experimental</groupId>
            <artifactId>spring-aot</artifactId>
            <version>0.12.0</version>
        </dependency>

这些插件:

代码语言:javascript
复制
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.7.0</version>
                <configuration>
                    <image>
                        <builder>paketobuildpacks/builder:tiny</builder>
                        <env>
                            <BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
                        </env>
                    </image>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.experimental</groupId>
                <artifactId>spring-aot-maven-plugin</artifactId>
                <version>0.12.0</version>
            </plugin>
            <plugin>
                <groupId>org.springframework.experimental</groupId>
                <artifactId>spring-aot-maven-plugin</artifactId>
                <version>0.12.0</version>
                <executions>
                    <execution>
                        <id>generate</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

这些资料是用来建立本地形象的:

代码语言:javascript
复制
      <profile>
            <id>native</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.graalvm.buildtools</groupId>
                        <artifactId>native-maven-plugin</artifactId>
                        <version>0.9.11</version>
                        <executions>
                            <execution>
                                <id>build-native</id>
                                <goals>
                                    <goal>build</goal>
                                </goals>
                                <phase>package</phase>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-maven-plugin</artifactId>
                        <configuration>
                            <classifier>exec</classifier>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>

为了构建映像,我使用以下命令行:mvn package -Pnativemvn package spring-boot:build-image;然后,结果出现在/target目录中,我使用./target/myApp来运行它。

以下是java --version的结果:

代码语言:javascript
复制
openjdk 17.0.3 2022-04-19
OpenJDK Runtime Environment GraalVM CE 21.3.2 (build 17.0.3+7-jvmci-21.3-b14)
OpenJDK 64-Bit Server VM GraalVM CE 21.3.2 (build 17.0.3+7-jvmci-21.3-b14, mixed mode, sharing)

我在github上找到了这个问题,它看起来与我的非常相似,如果不是完全相同的话。票已经关了,但我不明白决议。

该错误似乎与与环境相关的概要文件(dev、prod、test .)有关。Spring本地文档的一部分致力于这方面的工作。为了解决这个错误,我在application.yml配置文件中填写了一个配置文件。概要文件在运行时正确加载,但错误相同。

这个错误不是来自jdk和Spring库之间的兼容性问题吗?但是,从jdk 17开始,在javadoc中就出现了该方法。

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-29 15:00:26

从您链接的github问题中可以看出,解决方案是在GraalVM中的密封类上添加反射支持。

这是通过跟随拉请求合并到主服务器上的。

GraalVM发行说明中,我们可以看到,这使得它进入了来自22.0.0版本和更高版本的版本。

22.0.0 (2021-01-18)

这个日期似乎不对,可能是2022-01-18

在JDK 17: Class.isSealed()和Class.getPermittedSubclasses()上增加了对密封类反射内省的支持。

您当前的JDK使用的是GraalVM 21.3.2,因此还不包含此修复。解决方案是找到一个具有22.x或更高版本GraalVM的JDK构建。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72773873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档