转:https://www.pianshen.com/article/950119559/
1.返回对象参数为null时,该参数选择显示或者不显示
在返回参数给前端的时候,有些参数的值为null的时候,我们可以设置需要显示或者不需要显示
1.1设置返回为null的参数
在配置文件中加入配置
spring.jackson.default-property-inclusion: always
1.2设置不返回为null的参数
在配置文件中加入配置
spring.jackson.default-property-inclusion: non_null
2.返回参数为null时,转换为空字符串或者空数组
在返回数据时,前端不想要null值,需要我们把字符串、数字类型的null转换为空字符串,把集合类型的null转换为[]
2.1创建类MyNullArrayJsonSerializer
该类会将字段类型为集合类型的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.2 创建类MyNullJsonSerializer
该类会将字段类型为字符串、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(""); } }
2.3创建类MyBeanSerializerModifier
该类控制将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); } }
2.4配置类
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; } }
这样子处理后发现一个问题,Map格式数据返回,里面的日期全部成为了时间戳