Spring MVC @RequestBody如何工作

时间:2013-12-14 18:13:40

标签: java spring spring-mvc

我认为@RequestBody尝试通过属性名称在注释后将请求params映射到对象。

但如果我得到了:

@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

我哪里出错了?

2 个答案:

答案 0 :(得分:6)

不,这是@ModelAttribute的工作,而不是@RequestBody

  • @ModelAttribute使用相应请求参数的值填充目标对象的字段,并在必要时执行转换。它可用于HTML表单生成的请求,带参数的链接等。

  • @RequestBody使用预先配置的HttpMessageConverter之一将请求转换为对象。它可用于包含JSON,XML等的请求。但是,没有HttpMessageConverter复制@ModelAttribute的行为。

答案 1 :(得分:4)

将输入转换为bean需要:

对JSON主体使用POST或PUT请求。 在请求映射中使用“消耗”指定预期内容tipe也是很好的:

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

将实现HttpMessageConverter的转换器实例添加到servlet上下文(例如servlet.xml)

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

将jackson core和mapper jar添加到classpath(或pom.xml)

然后你可以尝试使用curl

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

很抱歉找不到详细信息,但我希望有所帮助