@RequestBody无效问题

在处理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 手动指定低版本


        
            
                
                    
                        
                            
                            
                            
                        
                        
                            
                            
                            
                        
                    
                
            
        
    

你可能感兴趣的:(@RequestBody无效问题)