SpringMVC не распознает параметры тела запроса при использовании PUT - PullRequest
17 голосов
/ 05 мая 2011

Возможно, это должно сработать, но, по крайней мере, я бы хотел понять, почему тогда.Я передаю простое значение val = somevalue в теле PUT, но spring отправляет обратно 400 Bad Request, так как кажется, что он не распознает параметр val.

Аналогичный запрос работает с POST.Может быть, SpringMVC не распознает тело запроса PUT в качестве источника для параметров?

Content=-Type правильно установлено в application / x-www-form-urlencoded в обоих случаях.

Метод, который Spring отказывается вызывать, таков:

@RequestMapping(value = "config/{key}", method = RequestMethod.PUT)
@ResponseBody
public void configUpdateCreate(final Model model, @PathVariable final String key, @RequestParam final String val,
        final HttpServletResponse response) throws IOException
{
    //...
}

Для полноты здесь приведен вызов jquery ajax.Я не вижу в этом ничего плохого.Клиент Firefox 4 или Chrome, оба показывают один и тот же результат.

$.ajax({
         url:url,
         type:'PUT',
         data:'val=' + encodeURIComponent(configValue),
         success: function(data) {...}
       });      

Есть идеи?

Ответы [ 4 ]

19 голосов
/ 10 июня 2011

На данный момент я не знаю, как обойти это, но вот отчет об ошибке, который называется «Не исправлю».Я боролся с той же проблемой

https://jira.springsource.org/browse/SPR-7414

Обновление: вот мое исправление.Я использую аннотацию RequestBody.Затем с помощью MultiValueMap.

http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/mvc.html#mvc-ann-requestbody

@RequestMapping(value = "/{tc}", method = RequestMethod.PUT) 
public void update(@PathVariable("tc") final String tc, 
@RequestBody MultiValueMap<String,String> body, HttpServletResponse response) {

    String name = body.getFirst("name");
// more code
}
12 голосов
/ 09 декабря 2012

Начиная с Spring 3.1, это решается с помощью org.springframework.web.filter.HttpPutFormContentFilter .

<filter>
    <filter-name>httpPutFormContentFilter</filter-name>
    <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>httpPutFormContentFilter</filter-name>
    <servlet-name>rest</servlet-name>
</filter-mapping>
1 голос
/ 20 января 2012

Это, как показано выше, похоже на ошибку в spring/servlet API.В действительности PUT запросы должны работать на Request Body (or payload), а не на параметрах запроса.В этом смысле API сервлетов и обработка Spring верны.

Сказав это, лучше и намного проще обойтись без передачи элемента данных из вашего вызова javascript/jQuery и передачи ваших параметров как части самого URL.то есть, установите параметры в поле url так же, как при вызове GET.

$.ajax({
            url: "yoururl" + "?param1=param2Val&..",
            type: "PUT",
            data: "",
            success: function(response) {
                // ....
            }
     });

теперь это работает для простых параметров, я думаю, не будет работать для сложных типов JSON.Надеюсь это поможет.

1 голос
/ 06 мая 2011

У меня нет правильного решения для вас, но в вашем случае я пытаюсь сделать следующее:

  • создать страницу с form:form method="PUT"
  • объявить HiddenHttpMethodFilter в web.xml

Если это будет работать, то

  • изменить type с PUT на POST при вызове ajax
  • добавить необходимые параметры, которые клиентимеет тег form:form (что-то вроде _method)

Другими словами, как я понимаю, Spring эмулирует PUT на основе простого POST со специальным параметром.Просто отправьте ему то, что он хочет.

См. Также: http://stsmedia.net/spring-finance-part-2-spring-mvc-spring-30-rest-integration/ и соответствующие примеры кода: http://code.google.com/p/spring-finance-manager/source/browse

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...