NoSuchMethodException:springframework.boot.autoconfigure.http.HttpMessageConverters

时间:2018-07-13 20:22:35

标签: java spring java-9

我想在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程序包?

4 个答案:

答案 0 :(得分:2)

在尝试将Spring Boot 2应用程序部署到Wildfly 13时遇到了相同的错误。这是我在寻找答案时出现的唯一堆栈溢出问题,因此我想将我的发现保留在此处如果其他人也有同样的问题,因为我的解决方案与目前唯一的其他解决方案完全不同。

我的应用程序可以在嵌入式Tomcat服务器上正常运行,但是由于存在与该问题相同的AopConfigException,因此部署到Wildfly将会失败。我还注意到,该异常的根本原因是Spring正在寻找无参数构造函数,当我在所有自动装配的Spring组件中添加无参数构造函数时,该服务实际上已部署到Wildfly,并且运行正常。但这似乎是一个错误的解决方法,感觉不对,所以我寻求一个更好的解决方案。

我从this github issue获悉,该异常发生在Wildfly中,因为Jboss模块没有公开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”作为“ Dependency”的一种方式。对我来说不幸的是,这是Maven pom的一部分,我的团队使用Gradle进行构建管理,所以我不得不寻找另一个解决方案。

在Gradle OR Maven中有效的解决方案

尽管可能有特定于Gradle的方法来完成上述任务,但我从this JBoss development guide发现,您可以使用jboss-deployment-structure.xml将依赖项添加到MANIFEST.MF中,其内容如下:< / p>

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

即使您确实使用了Maven,这似乎也是首选的解决方案,因为如果您改用Gradle,它的工作原理相同。当然,仅当问题仅存在于JBoss / Wildfly时,此解决方案才有效。

*请注意(以防JBoss指南的链接断开):jboss-deployment-structure.xml文件分别位于战争/罐子应用程序的WEB-INF或META-INF目录中。

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

您需要在运行时JVM参数中使用几个"a:1" "b:1" "a:2" "a:3" and "b:2",并准备在应用程序中的几乎所有地方添加--add-opens,以向Spring上下文公开尚未导出的内容。 More information

答案 3 :(得分:0)

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

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