Table of Contents
question
Solution
partial solution
Global solution
Customize CustomizeNullJsonSerializer
Define CustomizeBeanSerializerModifier
Inherits MappingJackson2HttpMessageConverter
Custom conversion
Question
The BladeBeanSerializerModifier defined by the blade framework will convert Boolean type null to false, and numeric type null will be converted to -1. In some cases, some fields are not required, and the details page will display -1.
Solution
Partial solution
You can also customize it by using @JsonSerialize(nullsUsing = NullSerializer.class) on the fields of the entity class
For example, convert date to long millisecond @JsonSerialize(using = Date2LongSerializer.class)
public class Date2LongSerializer extends JsonSerializer<Date> { @Override public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeNumber(date.getTime()); } }
Global solution
CustomizeNullJsonSerializer
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; public class CustomizeNullJsonSerializer { /** * Array collection class */ public static class NullArrayJsonSerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeStartArray(); gen.writeEndArray(); } } /** * String defines the default value you want to return */ public static class NullStringJsonSerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeString(""); } } /** * Number defines the default value you want to return */ public static class NullNumberJsonSerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeObject(null); } } /** * Boolean defines the default value you want to return */ public static class NullBooleanJsonSerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeObject(null); } } /** * Object defines the default value you want to return */ public static class NullObjectJsonSerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeStartObject(); gen.writeEndObject(); } } }
Define CustomizeBeanSerializerModifier
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.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; /*** * Custom serialization */ public class CustomizeBeanSerializerModifier extends BeanSerializerModifier { public static final String ARRAY_TYPE = "array"; public static final String STRING_TYPE = "string"; public static final String BOOLEAN_TYPE = "boolean"; public static final String NUMBER_TYPE = "number"; public static final String OBJECT_TYPE = "object"; public static final Map<String, JsonSerializer<Object>> map = new HashMap<String, JsonSerializer<Object>>() {<!-- -->{ put(ARRAY_TYPE, new CustomizeNullJsonSerializer.NullArrayJsonSerializer()); put(STRING_TYPE, new CustomizeNullJsonSerializer.NullStringJsonSerializer()); put(BOOLEAN_TYPE, new CustomizeNullJsonSerializer.NullBooleanJsonSerializer()); put(NUMBER_TYPE, new CustomizeNullJsonSerializer.NullNumberJsonSerializer()); put(OBJECT_TYPE, new CustomizeNullJsonSerializer.NullObjectJsonSerializer()); }}; @Override public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) { //Replace internal method for(BeanPropertyWriter beanPropertyWriter:beanProperties){ String type = getType(beanPropertyWriter); //Get the null value converter of the corresponding type JsonSerializer<Object> objectJsonSerializer = map.get(type); if(objectJsonSerializer!=null){ //Assign null converter beanPropertyWriter.assignNullSerializer(objectJsonSerializer); } } return beanProperties; } public String getType(BeanPropertyWriter p) { if (isArrayType(p)) { return ARRAY_TYPE; } if (isStringType(p)) { return STRING_TYPE; } if (isBooleanType(p)) { return BOOLEAN_TYPE; } if (isNumberType(p)) { return NUMBER_TYPE; } return null; } /** * Whether it is an array */ private boolean isArrayType(BeanPropertyWriter writer) { Class<?> clazz = writer.getType().getRawClass(); return clazz.isArray() || Collection.class.isAssignableFrom(clazz); } /** * Whether it is String */ private boolean isStringType(BeanPropertyWriter writer) { Class<?> clazz = writer.getType().getRawClass(); return CharSequence.class.isAssignableFrom(clazz) || Character.class.isAssignableFrom(clazz); } /** * Whether it is a numeric type */ private boolean isNumberType(BeanPropertyWriter writer) { Class<?> clazz = writer.getType().getRawClass(); return Number.class.isAssignableFrom(clazz); } /** * Whether it is boolean */ private boolean isBooleanType(BeanPropertyWriter writer) { Class<?> clazz = writer.getType().getRawClass(); return clazz.equals(Boolean.class); } }
Inherit MappingJackson2HttpMessageConverter
import com.fasterxml.jackson.databind.DeserializationFeature; import org.springblade.core.tool.utils.DateUtil; import org.springframework.http.MediaType; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import java.text.SimpleDateFormat; import java.util.TimeZone; /** * Inherit MappingJackson2HttpMessageConverter */ public class ContentMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter { public ContentMappingJackson2HttpMessageConverter() { super(); objectMapper.setSerializerFactory(objectMapper.getSerializerFactory().withSerializerModifier(new CustomizeBeanSerializerModifier())); objectMapper.setTimeZone(TimeZone.getDefault()); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.setDateFormat(new SimpleDateFormat(DateUtil.PATTERN_DATETIME)); } @Override public boolean canWrite(Class<?> clazz, MediaType mediaType) { return super.canWrite(clazz, mediaType); } }
Custom conversion
import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; /** * Custom conversion */ @Configuration public class MessageConverterConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // Set the highest priority converters.add(0, new ContentMappingJackson2HttpMessageConverter()); } }
The knowledge points of the article match the official knowledge files, and you can further learn related knowledge. Java skill treeOptionalOptional and Null128885 people are learning the system