情景: Java中通常都是模板对象,返回时有可能只用到部分字段,但返回客户端就显得很臃肿,好多字段都为null,这些字段也客户端也用不到,就须要咱们本身作处理。 这里是讲全局处理,单对象处理能够使用这个注解:@JsonInclude(JsonInclude.Include.NON_NULL) 一、通常都是在SpringBoot的yml里面添加这个属性: spring: jackson: default-property-inclusion: non_null 可是这样写有时候会失效,为何呢,看下面这句话:意思就是说当你使用 @EnableWebMvc 配置类来处理的MVC的时候,会退出Spring Boot默认MVC配置, 你能够使用 WebMvcConfigurationSupport 中的 getMessageConverters 手动执行全部操做。But!WebMvcConfigurationSupport 他已通过期了,getMessageConverters 它也用不了了, So,implements WebMvcConfigurer,重写 configureMessageConverters
/** * @Author : Yanqiang * @Date : 2019-10-23 * @Description : mvc应用配置 */ @Configuration @EnableWebMvc public class WebAppConfig implements WebMvcConfigurer { /** * 添加到消息转换器 * @param converters */ @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { /*super.configureMessageConverters(converters);*/ converters.add(responseBodyConverter()); //添加咱们自定义的 HttpMessageConverte converters.add(jackson2HttpMessageConverter()); } /** * 处理返回json格式 * 定义时间格式转换器 * @return MappingJackson2HttpMessageConverter */ @Bean public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //主要是这句处理 mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); //时间格式化 //mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); converter.setObjectMapper(mapper); return converter; } }
解析: MappingJackson2HttpMessageConverter.setObjectMapper(mapper); 是须要接收一个 ObjectMapper 咱们点进去看一下 ObjectMapper 是否能设置 Include, 进入 ObjectMapper 类,搜索 Include,会发现两个方法, //序列化时 一、ObjectMapper setSerializationInclusion(Include incl) //默认 二、ObjectMapper setDefaultPropertyInclusion(Include incl) 具体介绍能够看下这个: https://www.ibm.com/developerworks/cn/java/jackson-advanced-application/index.html?cm_mmc=dwchina-_-homepage-_-social-_-wechat 其余配置还有: //在反序列化时忽略在 json 中存在但 Java 对象不存在的属性 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //在序列化时日期格式默认为 yyyy-MM-dd'T'HH:mm:ss.SSSZ mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false) //在序列化时忽略值为 null 的属性 mapper.setSerializationInclusion(Include.NON_NULL); //忽略值为默认值的属性 mapper.setDefaultPropertyInclusion(Include.NON_DEFAULT); 更多配置信息能够查看 Jackson 的 DeserializationFeature,SerializationFeature 和 Include。 总结:仍是要多看源码啊!