NoSuchMethodException: springframework.boot.autoconfigure.ht



我想将Java 9与Spring一起使用。但我有个例外:

Caused by: org.springframework.aop.framework.AopConfigException: Unable to instantiate proxy using Objenesis, and regular proxy instantiation via default constructor fails as well; nested exception is java.lang.NoSuchMethodException: org.springframework.boot.autoconfigure.http.HttpMessageConverters$$EnhancerBySpringCGLIB$$1d90bff9.<init>()
at deployment.datalis_gateway.war//org.springframework.aop.framework.ObjenesisCglibAopProxy.createProxyClassAndInstance(ObjenesisCglibAopProxy.java:82)
at deployment.datalis_gateway.war//org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:205)
... 62 more
Caused by: java.lang.NoSuchMethodException: org.springframework.boot.autoconfigure.http.HttpMessageConverters$$EnhancerBySpringCGLIB$$1d90bff9.<init>()
at java.base/java.lang.Class.getConstructor0(Class.java:3302)
at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2512)
at deployment.datalis_gateway.war//org.springframework.aop.framework.ObjenesisCglibAopProxy.createProxyClassAndInstance(ObjenesisCglibAopProxy.java:76)
... 63 more

你知道我如何配置Java 9来找到这个受限制的Java包吗?

我在尝试将Spring Boot 2应用程序部署到Wildfly 13时遇到了同样的错误。这是我在搜索答案时出现的唯一一个Stack Overflow问题,所以我想我会把我的发现留在这里,以防其他人有同样的问题,因为我的解决方案与现在这里唯一的其他答案非常不同。

使用嵌入式Tomcat服务器,我的应用程序会运行得很好,但部署到Wildfly会失败,并出现本问题中询问的相同AopConfigException。我还注意到,在异常的根本原因中,Spring正在寻找一个无参数构造函数,当我在所有自动连接的Spring组件中添加无参数构造函数时,该服务实际上部署到了Wildfly,并且运行时没有出现任何问题。但这似乎是一个让人感觉不对的变通方法,所以我寻找了一个更好的解决方案。

我从这个github问题中了解到,这个异常发生在Wildfly中,因为Jboss模块没有公开Obgenesis进行构造函数注入所需的一些依赖项。他们给出的建议解决方案是通过简单地更新项目构建来添加依赖项,如下所示:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<Dependencies>jdk.unsupported</Dependencies>
</manifestEntries>
</archive>
</configuration>
</plugin>

如果这对你有效,祝贺你。我从这个JBoss问题中拼凑出,上面的解决方案只是添加";jdk.unsupported";作为";依赖关系";MANIFEST.MF文件中。不幸的是,这是Maven pom的一部分,我的团队使用Gradle进行构建管理,所以我不得不找到另一个解决方案。

适用于Gradle OR Maven的解决方案

尽管可能有一种特定于Gradle的方法来实现上述目标,但我从JBoss开发指南中发现,您可以使用JBoss-deployment-structure.xml将依赖项添加到MANIFEST.MF中,其中包含以下内容:

<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="jdk.unsupported"/>
</dependencies>
</deployment>
</jboss-deployment-structure>

这似乎是首选的解决方案,即使你确实使用了Maven,因为如果你以后改用Gradle,它也会起到同样的作用。当然,只有当问题被隔离到JBoss/Wildfly时,这个解决方案才有效。

*注意(如果JBoss指南的链接断开(:JBoss-deployment-structure.xml文件分别位于war/jar应用程序的WEB-INF或META-INF目录中。

同样值得注意的是,我在Java 11和Wildfly 13上看到了这个问题,但我强烈怀疑Java 9和10以及JBoss/Wildfly的其他版本也存在同样的问题。

在我的案例中,VM参数--add-modules=jdk.unsupported起到了帮助作用。在这种情况下,ObjenesisCglibAopProxy使用sun.reflect.ReflectionFactory创建一个代理,并且不查找缺少的构造函数。

如果添加jdk.unsupported作为全局模块,则无需更改应用程序:

<global-modules>
<module name="jdk.unsupported"/>

您需要在运行时JVM参数中使用几个--add-opens,并准备在应用程序中几乎所有向Spring上下文公开尚未导出的内容的地方添加opens ...。更多信息

问题似乎与java编译器版本有关。当编译的代码是java版本11时,我得到了这个错误,如果我把编译器改为8,我就看不到

相关内容

最新更新