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;
        }

    }


}

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