xiejun
2024-11-01 80b6cbfc9c861469146318d0b3dd5f8b8b525b8a
Source/BladeX-Tool/blade-core-tool/src/main/java/org/springblade/core/tool/jackson/BladeBeanSerializerModifier.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,107 @@
package org.springblade.core.tool.jackson;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
import org.springblade.core.tool.utils.StringPool;
import org.springblade.core.tool.utils.StringUtil;
import java.io.IOException;
import java.time.OffsetDateTime;
import java.time.temporal.TemporalAccessor;
import java.util.Collection;
import java.util.Date;
import java.util.List;
/**
 * jackson é»˜è®¤å€¼ä¸º null æ—¶çš„处理
 * <p>
 * ä¸»è¦æ˜¯ä¸ºäº†é¿å… app ç«¯å‡ºçްnull导致闪退
 * <p>
 * è§„则:
 * number -1
 * string ""
 * date ""
 * boolean false
 * array []
 * Object {}
 *
 * @author L.cm
 */
public class BladeBeanSerializerModifier extends BeanSerializerModifier {
   @Override
   public List<BeanPropertyWriter> changeProperties(
      SerializationConfig config, BeanDescription beanDesc,
      List<BeanPropertyWriter> beanProperties) {
      // å¾ªçŽ¯æ‰€æœ‰çš„beanPropertyWriter
      beanProperties.forEach(writer -> {
         // å¦‚果已经有 null åºåˆ—化处理如注解:@JsonSerialize(nullsUsing = xxx) è·³è¿‡
         if (writer.hasNullSerializer()) {
            return;
         }
         JavaType type = writer.getType();
         Class<?> clazz = type.getRawClass();
         if (type.isTypeOrSubTypeOf(Number.class)) {
//            writer.assignNullSerializer(NullJsonSerializers.NUMBER_JSON_SERIALIZER);
         } else if (type.isTypeOrSubTypeOf(Boolean.class)) {
            writer.assignNullSerializer(NullJsonSerializers.BOOLEAN_JSON_SERIALIZER);
         } else if (type.isTypeOrSubTypeOf(Character.class)) {
            writer.assignNullSerializer(NullJsonSerializers.STRING_JSON_SERIALIZER);
         } else if (type.isTypeOrSubTypeOf(String.class)) {
            writer.assignNullSerializer(NullJsonSerializers.STRING_JSON_SERIALIZER);
         } else if (type.isArrayType() || clazz.isArray() || type.isTypeOrSubTypeOf(Collection.class)) {
            writer.assignNullSerializer(NullJsonSerializers.ARRAY_JSON_SERIALIZER);
         } else if (type.isTypeOrSubTypeOf(OffsetDateTime.class)) {
            writer.assignNullSerializer(NullJsonSerializers.STRING_JSON_SERIALIZER);
         } else if (type.isTypeOrSubTypeOf(Date.class) || type.isTypeOrSubTypeOf(TemporalAccessor.class)) {
            writer.assignNullSerializer(NullJsonSerializers.STRING_JSON_SERIALIZER);
         } else {
            writer.assignNullSerializer(NullJsonSerializers.OBJECT_JSON_SERIALIZER);
         }
      });
      return super.changeProperties(config, beanDesc, beanProperties);
   }
   public interface NullJsonSerializers {
      JsonSerializer<Object> STRING_JSON_SERIALIZER = new JsonSerializer<Object>() {
         @Override
         public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeString(StringPool.EMPTY);
         }
      };
      JsonSerializer<Object> NUMBER_JSON_SERIALIZER = new JsonSerializer<Object>() {
         @Override
         public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeNumber(StringUtil.INDEX_NOT_FOUND);
         }
      };
      JsonSerializer<Object> BOOLEAN_JSON_SERIALIZER = new JsonSerializer<Object>() {
         @Override
         public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeObject(Boolean.FALSE);
         }
      };
      JsonSerializer<Object> ARRAY_JSON_SERIALIZER = new JsonSerializer<Object>() {
         @Override
         public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeStartArray();
            gen.writeEndArray();
         }
      };
      JsonSerializer<Object> OBJECT_JSON_SERIALIZER = new JsonSerializer<Object>() {
         @Override
         public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeStartObject();
            gen.writeEndObject();
         }
      };
   }
}