NoSuchMethodException:springframework.boot.autoconfigure.http.HttpMessageConverters

问题描述 投票:0回答:2

我想在Spring中使用Java 9。但我得到例外:

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包吗?

java spring java-9
2个回答
3
投票

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

我的应用程序可以使用嵌入式Tomcat服务器运行得很好,但部署到Wildfly将失败,并且在此问题中询问了相同的AopConfigException。我还注意到异常的根本原因是Spring正在寻找一个无参数构造函数,当我在所有自动装配的Spring组件中添加no-arg构造函数时,该服务实际部署到Wildfly并且运行没有任何问题。但这似乎是一种感觉错误的hacky解决方法,所以我寻找更好的解决方案。

我从this github issue那里了解到,这个异常发生在Wildfly中,因为Jboss Modules没有暴露Objenesis进行构造函数注入所需的一些依赖。他们提出的建议解决方案是通过简单地更新项目构建来添加依赖项,如下所示:

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

如果这适合你,恭喜你。我从this JBoss issue拼凑起来,上面的解决方案只是在MANIFEST.MF文件中添加“jdk.unsupported”作为“依赖”的方法。不幸的是,这是Maven pom的一部分,我的团队使用Gradle进行构建管理,所以我必须找到另一个解决方案。

Solution that works in Gradle OR Maven

虽然可能有一种Gradle特定的方法来完成上述操作,但是我从this JBoss development guide发现你可以使用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上也存在同样的问题。


0
投票

您需要在运行时JVM参数中使用几个--add-opens,并准备在应用程序的任何位置添加opens ...,以便向尚未导出的Spring上下文公开内容。 More information

© www.soinside.com 2019 - 2024. All rights reserved.