Spring返回错误的处理程序方法

时间:2013-11-22 23:24:44

标签: spring rest spring-mvc cors

我正在使用Jboss 6.1,Spring 3.2,hibernate验证以及最近启用的CORS支持。请求使用GET方法正常工作。如果使用请求方法POST,我希望控制器返回405。但我正在获取http状态代码400。我在jboss日志中启用了跟踪,发现spring返回了一个错误的处理程序。应用程序只有一个控制器接受POST请求方法,其余控制器定义为只接受GET方法。每当使用POST请求方法对这些控制器(使用GET定义)进行请求时,Spring就会尝试查找处理程序,但它以某种方式将处理程序与POST方法匹配。感谢您的帮助!

支持CORS选项的Web.xml

<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/web-application-context.xml</param-value>
    </init-param>
    <init-param>
        <param-name>dispatchOptionsRequest</param-name>
            <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

Spring context xml文件:

<mvc:annotation-driven validator="localValidatorFactoryBean">
<mvc:message-converters>
    <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
    <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
    <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="objectMapper" ref="customObjectMapper" />
    </bean>
</mvc:message-converters>

这是我的卷曲脚本:

curl -i -X POST -H "Content-type:application/json" -d    '{"param1":"value1","param2":"value2"}' http://localhost:8080/api/myrequest

卷曲响应:

HTTP / 1.1 400错误请求 服务器:Apache-Coyote / 1.1 X-Spatial-Web-Service-Version:2.0.0 Content-Type:text / html; charset = utf-8 内容长度:1079 日期:星期一,2013年11月18日23:14:11 GMT 连接:关闭

这是我的控制器方法,它使用hibernate bean validaton 1.1:

@RequestMapping(value = "myrequest", method = GET, produces = TEXT_XML_VALUE)
@ResponseBody
public String getDetails(
@Valid DetailRequest detailRequest, BindingResult results, HttpServletResponse resp) {
...
}

1 个答案:

答案 0 :(得分:0)

更改RequestMapping方法= POST,然后重试