我使用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/