I have an application with Spring 3.0.5.RELEASE trying to get the full content of a post using @RequestBody. The method is called, but the string passed is always empty. I have checked, by placing breakpoints, that the StringHttpMessageConverter is called, but the inner HttpInputMessage is empty.
I've seen this issue with both Jetty and Tomcat, so I'm discarding it's a problem with the container.
Here is my sample controller:
@Controller @RequestMapping("/") public class SubscriptionController { @RequestMapping(value = "/requestbody", method = RequestMethod.POST) public ModelAndView mycustomAction(@RequestBody String body) { // body is always empty Logger.getLogger(this.getClass()).debug("REQUEST BODY '" + body + "'"); return new ModelAndView("empty"); } } My application context is defined as follows:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- Enable auto detection of controllers --> <context:component-scan base-package="com.big.viajerotelcel.controller" /> <!-- use annotation driven mvc and one single validator with JSR-303 standard --> <mvc:annotation-driven /> <!-- Message source for this context, loaded from localized "messages_xx" files --> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basenames" value="classpath:i18n/messages" /> <property name="defaultEncoding" value="UTF-8" /> </bean> <!-- Declare the Interceptor --> <mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" p:paramName="locale" /> </mvc:interceptors> <!-- Declare the Resolver --> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" /> <!-- will load Tiles definitions! --> <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"> <property name="definitions"> <list> <value>/WEB-INF/general.xml</value> </list> </property> </bean> <!-- Tiles view resolver --> <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" /> </bean> <!-- Configure the multipart resolver --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- one of the properties available; the maximum file size in bytes (5MB) --> <property name="maxUploadSize" value="5120000" /> </bean> <!-- Adding these lines has no effect, the StringHttpMessageConverter is called either way --> <!-- <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/>--> <!-- --> <!-- <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">--> <!-- <property name="messageConverters">--> <!-- <list>--> <!-- <ref bean="stringHttpMessageConverter"/>--> <!-- </list>--> <!-- </property>--> <!-- </bean>--> </beans> I'm testing this using curl as follows:
curl -d asd=123 -d qwe=456 http://localhost:8080/requestbody
Any ideas or help is more than welcomed!