我正在将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>
我怀疑当 Wildfly 的 undertow 模块的subsystem
定义没有明确声明handler
时,Wildfly 默认为 file
处理程序,该处理程序可能负责 URL 重写 - 但我不确定这一点。
有关 Undertow 项目中处理程序的文档(Wildfly 的 undertow 模块所基于(表明支持"重定向"处理程序。 我已经考虑过使用它来解决意外的"/"重写,但我不清楚 Wildfly 的 undertow 模块是否支持此功能,如果支持,如何在 standalone.xml
中配置它。 然而,即使我能够,我认为这感觉就像一个黑客,我宁愿找到问题的根源(没有双关语(。
有许多 S.O. 问题描述了令人失望的RequestMapping("/")
行为,也有许多答案建议使用其他路径(如 ""
、"/index"
等(,但不要忘记:现有的(未更改的(代码在 JBoss 7.1.1 中运行良好。 (此外,这些问题都没有提到Wildfly,这可能是这个问题的关键考虑因素。 尽管如此,我还是尝试了各种建议,但一无所获。 看起来 URL 在到达调度程序 servlet 之前就被重写了。
所以,总而言之,我的问题是:
如何让带有
RequestMapping("/")
的 Spring MVC 应用程序在 Wildfly 8.1 中运行,就像在 JBoss 7.1.1 中一样?
在 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("/")
注释的控制器方法。