全局空值处理

211 阅读1分钟

问题

1. 在SpringMVC默认的Jackson消息转化器会把结果为null的变量也进行序列化操作,前端拿到数据后会很头疼。

image.png

2. 当序列号一个空对象时(把查询结果返回前端时)会报错;例如在分页查询中,result默认为空集合,当查询结果为空时就会报错。

解决

package com.ssm.subject.application.config;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.util.List;

/**
 * MVC的全局处理(空值)
 */
@Configuration
public class GlobalConfig extends WebMvcConfigurationSupport { 
    /**
     * configureMessageConverters:配置在 MVC 中用于处理 HTTP 消息转换的转换器列表。
     * @param converters
     */
    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        super.configureMessageConverters(converters); //保留父类对消息转换器列表可能已经做过的配置
        converters.add(mappingJackson2HttpMessageConverter()); //添加自定义的转换器
    }

    /**
     * 自定义mappingJackson2HttpMessageConverter
     * 目前实现:空值忽略,空字段可返回
     */
    private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        //ObjectMapper是 Jackson 库中用于处理 JSON 序列化和反序列化的核心类。
        ObjectMapper objectMapper = new ObjectMapper();
        // Jackson 库中的一个序列化特性: 默认情况下,序列化一个空对象时,会抛出异常。通过将这个特性设置为false,就改变了这种行为。
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        //设置序列化包含规则:在序列化时只包含非空的属性值(忽略空值)
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        return new MappingJackson2HttpMessageConverter(objectMapper);
    }

}

测试

image.png