情景:
   Java中一般都是模板对象,返回时有可能只用到部分字段,但返回客户端就显得很臃肿,好多字段都为null,这些字段也客户端也用不到,就需要我们自己做处理。

   这里是讲全局处理,单对象处理可以使用这个注解:@JsonInclude(JsonInclude.Include.NON_NULL)

   1、一般都是在SpringBoot的yml里面添加这个属性:
        spring:
            jackson:
               default-property-inclusion: non_null

   但是这样写有时候会失效,为什么呢,看下面这句话:意思就是说当你使用 @EnableWebMvc 配置类来处理的MVC的时候,会退出Spring Boot默认MVC配置,
   你可以使用 WebMvcConfigurationSupport 中的 getMessageConverters 手动执行所有操作。
   

Jackson 全局返回值过滤 null 值-LMLPHP

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,会发现两个方法,
        //序列化时
        1、ObjectMapper setSerializationInclusion(Include incl)
        //默认
        2、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 的 DeserializationFeatureSerializationFeatureInclude。



总结:还是要多看源码啊!
11-16 18:38