博客引用处(以下内容在原有博客基础上进行补充或更改,谢谢这些大牛的博客指导):
关于jackson的DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
1,先来了解一下DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES这个属性是什么.下面是它的API描述:
Feature that determines whether encountering of unknown properties (ones that do not map to a property, and there is no “any setter” or handler that can handle it) should result in a failure (by throwing a JsonMappingException) or not. This setting only takes effect after all other handling methods for unknown properties have been tried, and property remains unhandled.
Feature is enabled by default (meaning that a JsonMappingException will be thrown if an unknown property is encountered).
大概意思:
反序列化时,遇到未知属性(那些没有对应的属性来映射的属性,并且没有任何setter或handler来处理这样的属性)时是否引起结果失败(通过抛JsonMappingException异常).此项设置只对那些已经尝试过所有的处理方法之后并且属性还是未处理(这里未处理的意思是:最终还是没有一个对应的类属性与此属性进行映射)的未知属性才有影响.
此功能默认是启用的(意味着,如果遇到未知属性时会抛一个JsonMappingException)
举个例子:
比如一段json字符串是:{“id”:null,“username”:“你好”,“passwordXXXX”:“123456”},现在想反序列化为一个User对象,User类如下:
public class User {
private Long id;
private String username;
private String password;
//setter和getter方法略
}
根据上面的字符串,有一个属性passwordXXXX,但User类的属性没有对应的passwordXXXX属性,如果使用这个字符串反序列化为User对象就会抛JsonMappingException异常.但是如果将DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES设为false,那么就会忽略passwordXXXX这个属性的解析.解析的方法源码如下:
public static <T> T parse(String json, Class<T> clazz,boolean failOnUnknownProperties){
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, failOnUnknownProperties);
T result=null;
try {
result=objectMapper.readValue(json, clazz);
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
可以这样调用来避免:
String json="{\"id\":null,\"username\":\"你好\",\"passwordXXXX\":\"123456\"}";;
User result = JSON.parse(json, User.class, false);
System.out.println(result);
二.Spring MVC 的配置方式
基于java config方式配置的MappingJackson2HttpMessageConverter如下(重写WebMvcConfigurerAdapter的configureMessageConverters方法):
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().build();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
converters.add(new MappingJackson2HttpMessageConverter(objectMapper));
}
这里配成false,就是有个别请求参数不对应,也会将请求参数正常解析为User对象;如果配成true,如果遇到请求参数不对应,就会抛异常,返回400.
spring 3.2.8此值默认值为true,spring 4.2.5此值默认为false.从此看来,不同版本的值不同,以后版本应该都是false.如果要判断,可以在添加MappingJackson2HttpMessageConverter时,获取objectMapper后,使用objectMapper.isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)来判断