使用Java16时,tomcat找不到spring初始值设定项类

50few1ms  于 2021-07-15  发布在  Java
关注(0)|答案(1)|浏览(320)

我有一个非常简单的渐变( 7.0-rc-1 )使用嵌入的tomcat示例初始化单个spring5“helloworld”端点的脚本。原始代码取自我在互联网上找到的一个随机示例。我的gradle项目示例可以在这里找到。
我不知道它是如何工作的,但不知怎么的,web服务器知道如何调用 WebApplicationInitializer.onStartup(ServletContext) 方法,以便Spring初始化。
这在Java8上正常工作;但当我将gradle构建定义中的以下工具链规范更改为java16时失败。

java {
    toolchain {
//        languageVersion = JavaLanguageVersion.of(16)
        languageVersion = JavaLanguageVersion.of(8)
    }
}

当使用Java8时,spring被正确初始化,端点工作。
当使用Java16时 onStartup() 方法没有被调用,因此spring没有初始化,端点也不起作用(尽管tomcat仍然启动并响应一个错误)。
日志显示了这样一条消息,尽管没有stacktrace:

INFO: No Spring WebApplicationInitializer types detected on classpath

我需要做什么才能在Java16上工作?
请注意,我不想使用Spring Boot,请不要建议它。

txu3uszq

txu3uszq1#

我找到了一个解决方案,可以配置spring并响应 /hello 终结点。但我不知道为什么这样做有效,也不知道这样做是否正确。
如果有人能回答这个问题并解释一下Java16到底发生了什么-我很乐意将其标记为公认的答案。
变通办法
我的工作是以编程方式添加 ServletContainerInitializer 班级。
所以在我打电话给 addWebapp() 方法:

tomcat.addWebapp("", appBase);

我现在显式地添加spring初始化器:

Context appContext = tomcat.addWebapp("", appBase);
appContext.addServletContainerInitializer(new SpringAppConfig(), null);

更新了github上的代码。

相关问题