1. 程式人生 > >springboot下將返回的null值變為空字串或者空集合

springboot下將返回的null值變為空字串或者空集合

       最近在專案中遇到了後臺將返回資料中的null值全處理成了空字串,導致前端在使用集合型別的時候報錯,看了下當前程式碼處理的邏輯,是把所有的null值轉換成了空字串,對集合型別的資料沒有做特別處理。

        隨後自己搭建了一個springboot專案來測試各種方案,最後找到了兩篇文章,取長補短(雖然我不會寫,但是會改啊),實現了返回資料中的null值處理,集合型別的欄位返回空集合,其他型別的欄位返回空字串。

       參考文章連結:

       效果如下圖:             

        下面是實現的程式碼(自己也不是很懂,就按自己的理解說了)。

1. MyNullArrayJsonSerializer.java

        該類會將欄位型別為集合型別的null值處理成空集合

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

/**
 * 處理陣列型別的null值
 */
public class MyNullArrayJsonSerializer extends JsonSerializer {

    @Override
    public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        if (value == null) {
            jgen.writeStartArray();
            jgen.writeEndArray();
        }
    }
}

2.MyNullJsonSerializer.java

       該類會將欄位型別為字串、int等型別的null值處理成空字串

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

/**
 * 處理字串等型別的null值
 */
public class MyNullJsonSerializer extends JsonSerializer{

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

3.MyBeanSerializerModifier.java

        該類控制將null值處理成空集合還是空字串

package com.answer.waka.framework.platform.configuration;

import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;

import java.util.List;
import java.util.Set;

public class MyBeanSerializerModifier extends BeanSerializerModifier {

    //  陣列型別
    private JsonSerializer _nullArrayJsonSerializer = new MyNullArrayJsonSerializer();
    // 字串等型別
    private JsonSerializer _nullJsonSerializer = new MyNullJsonSerializer();

    @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 (isArrayType(writer)) {
                //給writer註冊一個自己的nullSerializer
                writer.assignNullSerializer(this._nullArrayJsonSerializer);
            } else {
                writer.assignNullSerializer(this._nullJsonSerializer);
            }
        }
        return beanProperties;
    }

    //判斷是什麼型別
    protected boolean isArrayType(BeanPropertyWriter writer) {
        Class clazz = writer.getPropertyType();
        return clazz.isArray() || clazz.equals(List.class) || clazz.equals(Set.class);
    }

}

4.JsonConfig.java

     配置類,啟動專案時會例項化

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

/**
 * 處理返回值中的null值
 */
@Configuration
public class JsonConfig {

    @Bean
    public MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter() {

        final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();

        ObjectMapper mapper = converter.getObjectMapper();

        // 為mapper註冊一個帶有SerializerModifier的Factory,此modifier主要做的事情為:當序列化型別為array,list、set時,當值為空時,序列化成[]
        mapper.setSerializerFactory(mapper.getSerializerFactory().withSerializerModifier(new MyBeanSerializerModifier()));

        return converter;
    }

}

至此,處理完成。