公司突然添加了后端响应规范,禁止值为null,所有需要统一赋默认值。像下图这种就需要根据不同类型来返回不同默认值。
首先创建一个Modifier
public class MyBeanSerializerModifier extends BeanSerializerModifier { //对值进行处理的JsonSerializer 后面会对此值进行实现赋值 private JsonSerializer<Object> _nullJsonSerializer = null; @Override public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) { // 循环所有的beanPropertyWriter for (int i = 0; i < beanProperties.size(); i++) { BeanPropertyWriter writer = beanProperties.get(i); // 判断字段的类型,如果是array,spring,integer则注册nullSerializer //给writer注册一个自己的nullSerializer writer.assignNullSerializer(this.defaultNullArrayJsonSerializer(writer.getPropertyType())); } return beanProperties; } }
其中包含方法,判断是什么类型,进行不同类型的格式赋值。
// 判断是什么类型 protected JsonSerializer<Object> defaultNullArrayJsonSerializer(Class<?> clazz) { _nullJsonSerializer = new SpringJsonSerializer(); if (clazz.isArray() || clazz.equals(List.class) || clazz.equals(Set.class)) { _nullJsonSerializer = new ArrayJsonSerializer(); } if (clazz.equals(Date.class)) { _nullJsonSerializer = new DateJsonSerializer(); } if (clazz.equals(Integer.class)) { _nullJsonSerializer = new IntegerJsonSerializer(); } return _nullJsonSerializer; }
JsonSerializer可以构建工厂,这里我展示一个Spring的处理方法,大家举一反三吧
//创建一个SpringJsonSerializer 实现serialize方法 public class SpringJsonSerializer extends JsonSerializer<Object> { @Override public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { if (o == null) { //这里就是如果值为null你需要改为什么值了 jsonGenerator.writeString(""); } } }
全部配置好了之后,我怎么让我写的生效的呢。
创建一个JacksonConfig
此代码中包含了将Boolean 类型转成对应的 NUMBER 即0为false,1为true
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import com.fasterxml.jackson.databind.ObjectMapper; // null转为空字符串 @Configuration public class JacksonConfig { @Bean @Primary @ConditionalOnMissingBean(ObjectMapper.class) public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build();
//此处为将Boolean 类型转成对应的 NUMBER 即0为false,1为true
objectMapper .configOverride(Boolean.class) .setFormat(JsonFormat.Value.forShape(JsonFormat.Shape.NUMBER));
//在此配置上面的Modifier objectMapper.setSerializerFactory(objectMapper.getSerializerFactory().withSerializerModifier(new MyBeanSerializerModifier())); return objectMapper; } }
好了下面就生效了。
参考资料: