4

我正在将 Spring MVC 应用程序从 JBoss 7.1.1 迁移到 Wildfly 8.1,这需要(鼓励?)我使用新的“undertow”模块而不是旧的“web”模块。事情正在顺利进行,除了现在对“ /”的请求,它用于调用带有注释的控制器方法@RequestMapping("/"),不再到达控制器方法。相反,这些请求似乎被立即重写(而不是重定向)到“ /index.html”。由于我没有(也从来不需要)这样的文件,所有对“ /”的请求现在都产生 404 错误。

有趣的是,所有其他 @RequestMapping带注释的控制器方法都继续正常运行。

这是我standalone.xml文件中的相关片段。

<subsystem xmlns="urn:jboss:domain:undertow:1.1">
    <buffer-cache name="default"/>
    <server name="default-server">
        <http-listener name="default" socket-binding="http" max-post-size="4194304"/>
        <host name="default-host" alias="localhost">
        </host>
    </server>
    <servlet-container name="default">
        <jsp-config development="true"/>
    </servlet-container>
</subsystem>

我怀疑当subsystemWildfly 的 undertow 模块的定义没有明确声明 ahandler时,Wildfly 默认为一个file处理程序,它可能负责 URL 重写——但我不确定这一点。

Wildfly 的 undertow 模块所基于的 Undertow 项目中有关处理程序的文档表明支持“重定向”处理程序。我曾考虑使用它来解决意外的“/”重写,但我不清楚 Wildfly 的 undertow 模块是否支持这一点,如果支持,如何在standalone.xml. 然而,即使我能够做到,我认为它会感觉像是一个 hack,我更愿意找到问题的根源(不是双关语)。

有许多 SO 问题描述了令人失望的RequestMapping("/")行为,许多答案建议使用其他路径(例如"","/index"等),但不要忘记:现有(未更改)代码在 JBoss 7.1.1 中运行良好。(此外,这些问题都没有提到 Wildfly,这可能是这个问题的关键考虑因素。)尽管如此,我尝试了各种建议,但一无所获。看起来 URL 在到达调度程序 servlet 之前就被重写了。

所以,总而言之,我的问题是:

如何RequestMapping("/")像在 JBoss 7.1.1 中一样让 Spring MVC 应用程序在 Wildfly 8.1 中运行?

4

1 回答 1

3

在 Wildfly 中,如果您web.xml没有<welcome-file-list>元素,则会为您提供一个元素,就像您以这种方式配置它一样:

 <welcome-file-list>
      <welcome-file>index.html</welcome-file>
      <welcome-file>index.htm</welcome-file>
      <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>

使用此默认配置,当 Wildfly 收到对“”的请求时/,路径会自动重写为index.html. 然后,此路径将与使用 注释的控制器方法不匹配RequestMapping("/")

JBoss 7 的行为显然有所不同,可能只是在找不到匹配的 servlet 后才引用欢迎文件列表。

无论是什么原因,您都可以通过明确定义自己的欢迎文件列表并在最后一个<welcome-file>元素中包含一个空的欢迎文件来解决新行为:

 <welcome-file></welcome-file>

这允许 Wildfly 将 " /" 重写为 " /",进而允许/servlet 调度程序处理对 " " 的请求(前提是其url-pattern设置为/)。然后,servlet 调度程序将调用带有注释的控制器方法RequestMapping("/")

于 2014-12-10T00:56:24.373 回答