Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring not accepting a POST parameter unless @RequestParam "required=false"

Tags:

rest

spring

I am running a Spring 3.1.2 application. I have a RESTful servlet with a number of methods. The GET methods are working fantastic (@PathVariables matching, responses correctly marshalled to JSON or XML based on the Accept header, etc) 100% of the time.

However the POST method is simply not working. After hours of messing around with converts and every other Spring aspect I could find (all tinkering reverted), I narrowed it do to the required field in @RequestParam. This is a simplified test method I've been using to investigate:

@RequestMapping (value = "/bogus",
                 method = POST)
public @ResponseBody PassResponse bogus (
            @RequestParam (value = "test", required = false) String test) {
    // Just some handy garbage objects that marshal to JSON/XML
    UserResponse user = new UserResponse ();
    user.setName (test);
    AccountDetail detail = new AccountDetail (user,null);
    return new PassResponse (detail);
}

required=false: everything works (parameter is received and interpreted). Exactly as I expect it to work

required=true: (or not specified, since this is the default) I consistently get the message "MissingServletRequestParameterException: Required String parameter 'test' is not present"

Client side view:

required=true

Request URL:http://localhost:8080/internal-project/rest/bogus
Request Method:POST
Status Code:400 Bad Request
Request Headersview source
Accept:application/json
Connection:keep-alive
Content-Length:12
Host:localhost:8080
Request Payload
test=LALALAA
Response Headersview source
Connection:close
Content-Length:971
Content-Type:text/html;charset=utf-8
Date:Wed, 24 Oct 2012 18:41:05 GMT
Server:Apache-Coyote/1.1

required=false

Request URL:http://localhost:8080/internal-project/rest/bogus
Request Method:POST
Status Code:200 OK
Request Headersview source
Accept:application/json
Connection:keep-alive
Content-Length:12
Host:localhost:8080
Request Payload
test=LALALAA
Response Headersview source
Content-Type:application/json;charset=UTF-8
Date:Wed, 24 Oct 2012 18:44:03 GMT
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked

It is the exact same test suite being run when toggling required and I can see the parameter is being passed. When the parameter is optional, Spring handles the it correctly.

If anyone has run across this before or has any ideas I'd love to hear them. Marking the required parameter as optional, even if it works, is terrible self documentation even if I comment it. Plus the behavior is making me a little nervous. Hopefully I just screwed something up somewhere...

like image 941
node42 Avatar asked Oct 24 '12 18:10

node42


1 Answers

Your Content-Type header should be application/x-www-form-urlencoded I think.

like image 181
Biju Kunjummen Avatar answered Oct 02 '22 18:10

Biju Kunjummen