Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc Spring 3.2.1-尾部斜杠未映射;从客户端请求中删除斜杠映射正确_Spring Mvc - Fatal编程技术网

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

Spring mvc Spring 3.2.1-尾部斜杠未映射;从客户端请求中删除斜杠映射正确,spring-mvc,Spring Mvc,我使用的是Spring3.2.1,遇到了一个奇怪的问题,它与将请求映射到适当的@Controller方法有关。例如,我们的客户正在使用此URL,但它不起作用: /诊所/1271/患者/?状态=全部&tz_偏移量=240 标题是:{Accept=application/json,Content-Type=text/html;charset=utf-8} 我已经尝试了所有建议的操作,即使用RequestMappingHandlerMapping,包括@RequestMapping注释上我的值路径列表

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

/诊所/1271/患者/?状态=全部&tz_偏移量=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
    }
}
以下是spring配置文件:

<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>
然而,以下URL使用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一切正常。然而,我最近改用了MacBookPro并安装了Tomcat7,在那里一切都不像在Tomcat6上那样正常。这是解决这个问题的一个相当简单的解决方案,如下所示,只需将servlet的url映射修改为/*而不是/。该应用程序现在部署在Tomcat6、Tomcat7和Weblogic上都没有问题,所以我对这个建议非常满意

互联网上有一篇文章很好地说明了这个问题,我认为应该有更多的人阅读和理解它,因为有很多问题与URI/URL构造的这个特定问题相关。以下是该文档的链接:


您是否正在尝试使用/?状态而不是仅使用?状态。后者更常见。我刚刚用一个尾随的反斜杠测试了一些东西,但我不得不将它添加到我的安全配置中,以使其正常工作,但这种格式并不常见。请尝试将/to/*更改,然后查看默认值是否为true。你不必明确地设置它。有两个问题,我看到您的disacterservlet启动设置为2。还有其他servlet吗?对不起,伙计们,由于某种原因,我没有收到关于你们回复的电子邮件。我没有将/*添加到配置中,但以前不需要它。如果你往下看,你会发现我已经确认罪犯是Tomcat。这是一个很好的资源,可以用来回顾造成这种状况的老派原因,以及我们的标准是如何偏离预期的,而预期现在已经成为事实上的标准。干杯,谢谢你的帮助!仆从-你有很好的观察技能!另一个定义的servlet实际上被注释掉,以便部署到Tomcat。它是一个servlet,将返回Weblogic中的静态文件资源。默认weblogic.servlet.FileServlet 1,但正如我所说的,对于本地部署,这是注释掉的。但这是一个伟大的问题!
protocol://localhost:8080/patientcheckin/clinic/1271/patients/?status=ALL
protocol://localhost:8080/patientcheckin/clinic/1271/patients?status=ALL