Regarding the problem of Blade framework converting null value of numeric type to -1

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