我正在将一个Spring MVC应用程序从JBoss 7.1.1迁移到Wildfly 8.1,它需要(鼓励?)我使用新的"undertow" module而不是旧的“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的underow模块的subsystem
定义没有明确声明handler
时,Wildfly默认为file
处理程序,它可能负责URL重写 - - 但我不确定这一点。
Documentation about handlers,Wildfly的底层模块所基于的,表示支持“重定向”处理程序。我已经考虑过使用它来解决意外的“/”重写,但我不清楚Wildfly的下载模块是否支持这个,如果是的话,如何在standalone.xml
中配置它。然而,即使我能够,我认为它会感觉像是一个黑客,而我更愿意找到问题的根源(没有任何双关语)。
有许多S.O.描述令人失望的RequestMapping("/")
行为的问题,以及建议使用其他路径(例如""
,"/index"
等)的许多答案,但不要忘记:现有(未更改的)代码仅适用在JBoss 7.1.1中很好。 (此外,这些问题都没有提到Wildfly,这可能是这个问题的关键考虑因素。)尽管如此,我还是试验了各种各样的建议而无处可去。看起来URL似乎在它到达调度程序servlet之前被重写。
总而言之,我的问题是:
如何在Wildfly 8.1中运行带有
RequestMapping("/")
的Spring MVC应用程序,就像在JBoss 7.1.1中一样?
答案 0 :(得分:2)
在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
1}}设置为/
)。然后,servlet调度程序将调用用RequestMapping("/")
注释的控制器方法。