2013-12-14 4 views
4

Я думал, что @RequestBody пытается передать запрос params объекту после аннотации названиями свойств.Spring MVC как работает @RequestBody

Но если бы я получил:

@RequestMapping(value = "/form", method = RequestMethod.GET) 
public @ResponseBody Person formGet(@RequestBody Person p,ModelMap model) { 
    return p; 
} 

Запрос:

http://localhost:8080/proj/home/form?id=2&name=asd 

Возврат 415

Когда я изменяю @RequestBody Person p с @RequestParam Map<String, String> params это нормально:

@RequestMapping(value = "/form", method = RequestMethod.GET) 
public @ResponseBody Person formGet(@RequestParam Map<String, String> params) { 
     return new Person(); 
} 

Человек Класс:

public class Person{ 
    private long id; 
    private String name; 

    public Person() { 
    } 

    public Person(long id, String name) { 
     super(); 
     this.id = id; 
     this.name = name; 
    } 
    public long getId() { 
     return id; 
    } 
    public void setId(long id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
} 

Spring vresion 3.2.3.RELEASE

Где я ошибся?

+0

Вы пытались добавить конструктор по умолчанию к 'Person'? – jbx

+0

Просто попробовал, не помог. Благодарю. –

ответ

6

Нет, это работа для @ModelAttribute, а не @RequestBody.

  • @ModelAttribute заполнит поля целевого объекта со значениями соответствующих параметров запроса, выполняя преобразование, если это необходимо. Он может использоваться для запросов, генерируемых формами HTML, ссылками с параметрами и т. Д.

  • @RequestBody преобразует запросы к объекту, используя один из предварительно сконфигурированных HttpMessageConverter. Он может использоваться для запросов, содержащих JSON, XML и т. Д. Однако нет HttpMessageConverter, который воспроизводит поведение @ModelAttribute.

+0

Отлично, спасибо. –

4

Преобразование входного сигнала в потребности фасоли:

использования POST или PUT запрос, например, с JSON тела. Это также хорошо, чтобы указать предполагаемое содержание Tipe на «съедает» в запросе отображения:

@RequestMapping(value = "/form", method = RequestMethod.POST, consumes = "application/json") 

Добавить экземпляр преобразователя, который реализует HttpMessageConverter контекста сервлета (servlet.xml, например)

<bean id="jsonConverter" 
     class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
<property name="supportedMediaTypes" value="application/json" /> 
</bean> 

Добавить Джексон ядро ​​и картограф банку к классам (или pom.xml)

, то вы можете попробовать его с помощью завитка

curl -X POST http://localhost:8080/proj/home/form -d '{"name":"asd", "id": 2}' -H 'Content-type:application/json' 

Извините за недостающие детали, но я надеюсь, что это поможет

Смежные вопросы