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