springboot下將返回的null值變為空字串或者空集合
阿新 • • 發佈:2019-02-17
最近在專案中遇到了後臺將返回資料中的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;
}
}
至此,處理完成。