SpringMVC не распознает параметры тела запроса при использовании PUT
Может быть, это не должно работать, но, по крайней мере, я хотел бы понять, почему. Я передаю простое значение 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) {...}
});
Любые идеи?
Ответы
Ответ 1
В данный момент я не знаю об этой работе, но вот отчет об ошибке, который называется "Не исправить". Я борюсь с той же проблемой
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
}
Ответ 2
Начиная с 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>
Ответ 3
У меня нет правильного решения для вас, но в вашем случае я стараюсь:
- создать страницу с
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
НТН
Ответ 4
Это, как указано выше, кажется ошибкой в 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. Надеюсь это поможет.