我认为@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
我哪里出错了?
答案 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'
很抱歉找不到详细信息,但我希望有所帮助