SpringBoot NULL转“”(空字符串)

#SpringBoot NULL转“”(空字符串)
有时候前端的同学要求把String类型为NULL变成空字符串“”返回给他们,然而我们又不能简单的把全局的所有的类型为NULL的对象都这么去处理,而且也不能在非Http请求中这么返回,因为严格来说NULL并不等于“”,可能会引发意想不到的错误,所以我们只需要在Http访问的时候把JSON的String返回去。所以参考下面一篇文章,但是引用的文章中会导致其它的注解失效,而且影响了其它代码。所以这里我重新写了一份
本文部分引用自:jackson自定义序列化中null值的处理

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.io.IOException;
import java.util.Date;
import java.util.List;

@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {

    /**
     * 专门处理http json null 转 "" 字符串的问题
     * @param converters
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        initGlobalJackson2ObjectMapperBuilder(builder);
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.setSerializerFactory(objectMapper.getSerializerFactory().withSerializerModifier(new MyNullBeanSerializerModifier()));
        MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        jackson2HttpMessageConverter.setObjectMapper(objectMapper);
        converters.add(jackson2HttpMessageConverter);
    }

    static public void initGlobalJackson2ObjectMapperBuilder(Jackson2ObjectMapperBuilder builder) {
       //全局共有的序列化反序列化用builder参数设置即可
    }


    @Bean("jackson2ObjectMapperBuilderCustomizer")
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        Jackson2ObjectMapperBuilderCustomizer customizer = new Jackson2ObjectMapperBuilderCustomizer() {
            @Override
            public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
              initGlobalJackson2ObjectMapperBuilder(jacksonObjectMapperBuilder);
            }
        };
        return customizer;
    }



    static public class MyNullStringJsonSerializer extends JsonSerializer {

        @Override
        public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
                throws IOException, JsonProcessingException {
            if(o == null) {
                jsonGenerator.writeString("");
            }
        }
    }


    static public class MyNullBeanSerializerModifier extends BeanSerializerModifier {
        // 字符串等类型
        private JsonSerializer _nullJsonSerializer = new MyNullStringJsonSerializer();

        @Override
        public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List beanProperties) {
            //循环所有的beanPropertyWriter
            for (int i = 0; i < beanProperties.size(); i++) {
                BeanPropertyWriter writer = (BeanPropertyWriter) beanProperties.get(i);
                //判断字段的类型,如果是array,list,set则注册nullSerializer
                if (writer.getPropertyType().equals(String.class)) {
                    writer.assignNullSerializer(this._nullJsonSerializer);
                }
            }
            return beanProperties;
        }

    }


}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章