Подтвердить что ты не робот

Spring не принимает параметр POST, если только @RequestParam "required = false"

Я запускаю приложение Spring 3.1.2. У меня есть сервлет RESTful с рядом методов. Методы GET работают фантастически (соответствие @PathVariables, ответы корректно сопоставлены с JSON или XML на основе заголовка Accept и т.д.) В 100% случаев.

Однако метод POST просто не работает. Спустя несколько часов после конвертирования и любого другого аспекта Spring я мог найти (все вернувшиеся назад), я сузил его до поля required в @RequestParam. Это упрощенный метод проверки, который я использовал для исследования:

@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: все работает (параметр получен и интерпретируется). Именно так, как я ожидаю, он будет работать

required = true: (или не указано, поскольку это значение по умолчанию) Я последовательно получаю сообщение "MissingServletRequestParameterException: параметр обязательной строки" test "отсутствует"

Вид на стороне клиента:

требуется = истина

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

требуется = ложь

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

Это тот же самый набор тестов, который запускается при переключении required, и я вижу, что этот параметр передается. Если параметр не является обязательным, Spring обрабатывает его правильно.

Если кто-то сталкивался с этим раньше или имеет какие-либо идеи, я бы хотел их услышать. Маркировка требуемого параметра как необязательного, даже если он работает, - это ужасная документация, даже если я прокомментирую ее. Плюс поведение меня немного нервничает. Надеюсь, я просто что-то прикрутил...

4b9b3361

Ответ 1

Ваш заголовок Content-Type должен быть application/x-www-form-urlencoded, я думаю.