Spring 3.2.1 - 尾部斜杠没有被映射;正确映射从客户端请求中删除斜杠

时间:2015-03-11 23:28:52

标签: spring-mvc

我使用Spring 3.2.1,遇到了一个与将请求映射到适当的@Controller方法相关的奇怪问题。例如,我们的客户正在使用此URL(但它不起作用):

http://server:port/appcontext /诊所/ 1271 /患者/状态= ALL&安培; TZ_OFFSET = 240

标题是:{Accept = application / json,Content-Type = text / html; charset = utf-8}

我已经尝试了所有建议的操作,即使用RequestMappingHandlerMapping,包括我的"值"列表中的尾部斜杠。 @RequestMapping注释上的路径。

这是控制器代码:

@Controller
public class ClinicController {
    @RequestMapping(value = {"/clinic/{givenClinicId}/patients", "/clinic/{givenClinicId}/patients/"}, method = RequestMethod.GET, produces={"application/json"})
    public @ResponseBody Object retrievePatients(
        @PathVariable String givenClinicId,
        @RequestParam(required = false, value="status") String status,
        @RequestParam(required = false) @DateTimeFormat(iso = ISO.DATE) String date,
        @RequestParam(required = false, value = "tz_offset") String givenTzOffset,
        @RequestParam(required = false, value = "filter") String givenPatientFilter)
    {
        // do some work here
    }
}

这是弹簧配置文件:

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" />
<bean id="contentNegotiationManager"       class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorParameter" value="true"/>
    <property name="ignoreAcceptHeader" value="false" />
    <property name="useJaf" value="false"/>
    <property name="mediaTypes">
        <map>
             <entry key="html" value="text/html" />
             <entry key="json" value="application/json" />
             <entry key="xml" value="application/xml" />
        </map>
    </property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
    <property name="prefix">
        <value>/WEB-INF/jsp/</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>
</bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
    <property name="useTrailingSlashMatch" value="true"></property>
</bean>
<bean id="handlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="webBindingInitializer">
        <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"/>
    </property>
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
        </list>
    </property>
</bean>

这是相关的web.xml:

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
        </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

以下是日志输出,演示了RequestMappingHandlerMapping从@Controller中适当地获取配置:

2015-03-11 18:41:04 INFO  ethod.annotation.RequestMappingHandlerMapping  -
Mapped "{[/clinic/{givenClinicId}/patients || /clinic/{givenClinicId}/patients/],
methods=[GET],params=[],headers=[],consumes=[],produces=[application/json],
custom=[]}" onto public java.lang.Object com.fmcna.csg.pci.controller.ClinicController
.retrievePatients(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)

然而,以下网址因HTTP 404而失败:

protocol://localhost:8080/patientcheckin/clinic/1271/patients/?status=ALL

但这很好用:

protocol://localhost:8080/patientcheckin/clinic/1271/patients?status=ALL

我觉得这很简单,但我的智慧结束了。哦是的,还有一件事:代码今天在PROD中运行良好,但在DEV中没有。我们确实有不同的容器(PROD中的Weblogic,DEV中的Tomcat),但这在过去并不是一个问题。

另一个警告,我们有许多使用此服务的外部业务合作伙伴,更改API以支持尾部斜杠是不可行的。另外,我真的不想通过重定向来破解这个问题,但我宁愿更好地回答一下为什么Spring无法解决映射问题。

请帮助!!

好的,这可以像已回答的那样关闭。关于Tomcat的各种版本有一些奇怪之处。 Tomcat 6一切都按预期工作。但是,我最近转换为Macbook Pro并安装了Tomcat 7,其中所有内容都不像Tomcat 6那样有效。这是一个解决问题的简单解决方案,如下图所示,只需修改url-mapping for my servlet到&#34; / *&#34;而不是&#34; /&#34;。该应用程序现在部署在Tomcat 6,Tomcat 7和Weblogic上都没有问题,所以我对这个建议非常满意。

互联网上有一篇文章说明了这个问题,我相信它应该被更多人阅读和理解,因为有很多关于这个URI / URL特定问题的问题施工。这是该文档的链接:

https://cdivilly.wordpress.com/2014/03/11/why-trailing-slashes-on-uris-are-important/

0 个答案:

没有答案