Springbootカスタム変換処理springmvcがjsonを返すときの各タイプがnullの場合


以前は直接ライブラリを調べてエンティティクラスを返し、ライブラリフィールドがnullの場合、jsonの場合、フィールドがnullの場合
1、第一の解決方案
@JsonInclude(JsonInclude.Include.NON_NULL)を使用して、nullフィールドを無視し、値のあるパラメータを直接返します.
しかし、フロントエンドはすべてのフィールドを望んでおり、タイプに応じて空にしなければならないためnullではなく、類似している(Stringタイプの戻り")、Integerタイプの戻り0).
オンラインクエリはすべてObjectMapperを直接修正し、serializerをnullに設定するときに空の文字列を直接設定しますが、stringにかかわらずintegerはnullに設定されます.だから2つ目の案を採用します
2、第二の解決方案
BeanSerializerModifierを継承
public class MyBeanSerializerModifier extends BeanSerializerModifier {

    private JsonSerializer _nullArrayJsonSerializer = new MyNullArrayJsonSerializer();

    private JsonSerializer _nullStringJsonSerializer = new MyNullStringJsonSerializer();

    private JsonSerializer _nullIntegerJsonSerializer = new MyNullIntegerJsonSerializer();

    @Override
    public List changeProperties(SerializationConfig config, BeanDescription beanDesc,
                                                     List beanProperties) {
        //      beanPropertyWriter
        for (int i = 0; i < beanProperties.size(); i++) {
            BeanPropertyWriter writer = beanProperties.get(i);
            //        ,   array,list,set   nullSerializer
            if (isArrayType(writer)) {
                // writer       nullSerializer
                writer.assignNullSerializer(this.defaultNullArrayJsonSerializer());
            }
            if (isStringType(writer)) {
                writer.assignNullSerializer(this.defaultNullStringJsonSerializer());
            }

            if (isIntegerType(writer)) {
                writer.assignNullSerializer(this.defaultNullIntegerJsonSerializer());
            }
        }
        return beanProperties;
    }

    //        
    protected boolean isArrayType(BeanPropertyWriter writer) {
        Class> clazz = writer.getPropertyType();
        return clazz.isArray() || clazz.equals(List.class) || clazz.equals(Set.class);
    }

    protected boolean isStringType(BeanPropertyWriter writer) {
        Class> clazz = writer.getPropertyType();
        return clazz.equals(String.class);
    }

    protected boolean isIntegerType(BeanPropertyWriter writer) {
        Class> clazz = writer.getPropertyType();
        return clazz.equals(Integer.class) || clazz.equals(int.class);
    }

    protected JsonSerializer defaultNullArrayJsonSerializer() {
        return _nullArrayJsonSerializer;
    }

    protected JsonSerializer defaultNullStringJsonSerializer() {
        return _nullStringJsonSerializer;
    }

    protected JsonSerializer defaultNullIntegerJsonSerializer() {
        return _nullIntegerJsonSerializer;
    }
}

対応処理のタイプnull
集合Array
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();
        } else {
            jgen.writeObject(value);
        }
    }
}

Integer数字()
public class MyNullIntegerJsonSerializer extends JsonSerializer {

    @Override
    public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        if (value == null) {
            jgen.writeNumber(0);
        }
    }
}

String文字列
public class MyNullStringJsonSerializer extends JsonSerializer {

    @Override
    public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        if (value == null) {
            jgen.writeString("");
        }
    }
}

最後にBeanSerializerModifierのMybeanSerializeModifierをObjectMapperに設定して処理し、@Configuration注記でspring管理に渡します.コードは以下の通りです.
@Configuration
public class ClassJsonConfiguration {

    @Bean
    public MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter() {

        final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();

        ObjectMapper mapper = converter.getObjectMapper();

        //  mapper      SerializerModifier Factory, modifier       :       ,       null   

        mapper.setSerializerFactory(mapper.getSerializerFactory().withSerializerModifier(new MyBeanSerializerModifier()));

        return converter;
    }

}

プロジェクトが使用するマイクロサービスであるため、カスタム注釈を各サービスに提供するために定義すると、単一のプロジェクトは上記の手順でよい.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(ClassJsonConfiguration.class)
@Documented
public @interface EnableClassJsonConfig {
}

上にあります.自分の記録としても、それが必要な人には役に立つことを願っています.
参考ブログ:https://www.cnblogs.com/lic309/p/5048631.html