在处理contentType=application/json时,一般采用@RequestBody进行数据绑定,在request body中读取数据转换成指定类型,在处理请求的方法中,@RequestBody只能包含一个,因为流读取一次之后会关闭
@RequestBody 进行数据绑定时,默认json解析使用的是jackjson,在3.1.2之前采用
MappingJacksonHttpMessageConverter
(jackson1.x),之后版本额外增加了MappingJackson2HttpMessageConverter
(jackson2.x),在4.x之后废弃了MappingJacksonHttpMessageConverter
以上两种参数解析在默认情况下是全解析(否则会报错),数据接收的对象必须包含请求的json的所有key,
类
public class User{
private String name;
private String age;
//省略get set
}
json
{"name":"张三","age":12,"address":"xxx"}
由于User没有指定address会报错
如果真的不想映射address字段可在类上添加@JsonIgnoreProperties(ignoreUnknown = true)
即忽略未知列
如果请求的json参数是 {"r_name":"张三","r_age":12,"r_address":"xxx"}
可采用以下方式
public class User{
@JsonProperty("r_name")
private String name;
@JsonProperty("r_age")
private String age;
//省略get set
}
回归到原题,@RequestBody大部分会发生在spring3.1.2~4.0版本之间,主要原因就是在可能在项目中手动指定了MappingJacksonHttpMessageConverter
(在3.1.2之后的版本通过xml配置时,spring优先查找是否有2.x的jackjson版本,如果有则采用MappingJackson2HttpMessageConverter
,否则低版本的MappingJacksonHttpMessageConverter
)
而@JsonIgnoreProperties(ignoreUnknown = true)
@JsonProperty("r_name")
在1.x与2.x同时存在,在使用注解时,引包错误会导致@RequestBody报错无效
包路径
1.x
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty;
2.x
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
多说一句如果在对象转json时忽略空字段可在类上添加@JsonInclude(JsonInclude.Include.NON_NULL)
,不需要序列号某个字段,在方法或属性上添加@JsonIgnore
或者在类上@JsonIgnoreProperties
指定多个忽略字段
MappingJacksonHttpMessageConverter
手动指定低版本
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" >
<property name = "supportedMediaTypes">
<list>
<bean class="org.springframework.http.MediaType">
<constructor-arg index="0" value="text"/>
<constructor-arg index="1" value="*"/>
<constructor-arg index="2" value="UTF-8"/>
</bean>
<bean class="org.springframework.http.MediaType">
<constructor-arg index="0" value="application"/>
<constructor-arg index="1" value="json"/>
<constructor-arg index="2" value="UTF-8"/>
</bean>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
网友评论