Ver Fonte

优化枚举json序列化逻辑

Woody há 2 meses atrás
pai
commit
840a4512d7

+ 32 - 17
framework-base/src/main/java/com/chelvc/framework/base/apidoc/CustomizeParameterAnalyser.java

@@ -36,13 +36,15 @@ public class CustomizeParameterAnalyser extends ParameterAnalyser {
      */
     private boolean isEnumerateWrapping(Parameter parameter) {
         Field field = parameter.getField();
-        if (field == null) {
-            JsonSerialize annotation = parameter.getOriginal().getAnnotation(JsonSerialize.class);
-            return annotation != null && JacksonEnumerateSerializer.class.isAssignableFrom(annotation.using());
+        Class<?> type = ObjectUtils.ifNull(field, Field::getType, parameter::getOriginal);
+        JsonSerialize annotation = type.getAnnotation(JsonSerialize.class);
+        if (annotation != null && (annotation.using() == JacksonEnumerateSerializer.class
+                || annotation.contentUsing() == JacksonEnumerateSerializer.class)) {
+            return true;
         }
-        JsonSerialize annotation = field.getAnnotation(JsonSerialize.class);
-        return annotation != null && (JacksonEnumerateSerializer.class.isAssignableFrom(annotation.using())
-                || JacksonEnumerateSerializer.class.isAssignableFrom(annotation.contentUsing()));
+        return field != null && (annotation = field.getAnnotation(JsonSerialize.class)) != null
+                && (annotation.using() == JacksonEnumerateSerializer.class
+                || annotation.contentUsing() == JacksonEnumerateSerializer.class);
     }
 
     /**
@@ -83,18 +85,31 @@ public class CustomizeParameterAnalyser extends ParameterAnalyser {
             parameter.setExample("PT1S");
         } else if (!parameter.isInput() && this.isEnumerateWrapping(parameter)) {
             parameter.setType(Object.class);
-            List<Parameter.Option> options = parameter.getOptions();
-            List<Parameter> fields = Lists.newArrayListWithCapacity(2);
-            fields.add(this.initializeEnumerateWrappingParameter(
-                    JacksonEnumerateSerializer.CODE, "编码", options
-            ));
-            options = ObjectUtils.isEmpty(options) ? Collections.emptyList() :
-                    options.stream().map(option -> Parameter.Option.builder().key(option.getValue())
+            List<Parameter> fields = Lists.newLinkedList();
+            List<Parameter.Option> options = ObjectUtils.ifEmpty(
+                    parameter.getOptions(),
+                    os -> os.stream().map(option -> Parameter.Option.builder().key(option.getValue())
                             .value(option.getKey()).deprecated(option.isDeprecated()).build())
-                            .collect(Collectors.toList());
-            fields.add(this.initializeEnumerateWrappingParameter(
-                    JacksonEnumerateSerializer.DESCRIPTION, "描述", options
-            ));
+                            .collect(Collectors.toList()),
+                    Collections::emptyList
+            );
+            Class<?> type = ObjectUtils.ifNull(parameter.getField(), Field::getType, parameter::getOriginal);
+            ObjectUtils.foreachClassFields(type, field -> {
+                String name = field.getName();
+                List<Parameter.Option> _options = JacksonEnumerateSerializer.CODE.equals(name)
+                        || JacksonEnumerateSerializer.DESCRIPTION.equals(name) ? options : Collections.emptyList();
+                fields.add(this.initializeEnumerateWrappingParameter(name, this.getDescription(field), _options));
+            });
+            if (fields.stream().noneMatch(field -> JacksonEnumerateSerializer.CODE.equals(field.getName()))) {
+                fields.add(this.initializeEnumerateWrappingParameter(
+                        JacksonEnumerateSerializer.CODE, "编码", options
+                ));
+            }
+            if (fields.stream().noneMatch(field -> JacksonEnumerateSerializer.DESCRIPTION.equals(field.getName()))) {
+                fields.add(this.initializeEnumerateWrappingParameter(
+                        JacksonEnumerateSerializer.DESCRIPTION, "描述", options
+                ));
+            }
             parameter.setFields(fields);
             parameter.setOptions(Collections.emptyList());
         }

+ 1 - 2
framework-base/src/main/java/com/chelvc/framework/base/context/Using.java

@@ -1,6 +1,5 @@
 package com.chelvc.framework.base.context;
 
-import com.chelvc.framework.common.model.Enumerable;
 import com.chelvc.framework.common.util.DateUtils;
 import lombok.Getter;
 
@@ -11,7 +10,7 @@ import lombok.Getter;
  * @date 2023/9/10
  */
 @Getter
-public enum Using implements Enumerable {
+public enum Using {
     /**
      * 历史首次
      */

+ 1 - 0
framework-common/src/main/java/com/chelvc/framework/common/function/Getter.java

@@ -11,5 +11,6 @@ import java.util.function.Function;
  * @author Woody
  * @date 2024/1/30
  */
+@FunctionalInterface
 public interface Getter<T, R> extends Function<T, R>, Serializable {
 }

+ 1 - 0
framework-common/src/main/java/com/chelvc/framework/common/function/Setter.java

@@ -11,5 +11,6 @@ import java.util.function.BiConsumer;
  * @author Woody
  * @date 2024/1/30
  */
+@FunctionalInterface
 public interface Setter<T, U> extends BiConsumer<T, U>, Serializable {
 }

+ 9 - 11
framework-common/src/main/java/com/chelvc/framework/common/jackson/JacksonEnumerateSerializer.java

@@ -1,12 +1,13 @@
 package com.chelvc.framework.common.jackson;
 
 import java.io.IOException;
+import java.util.Map;
 
-import com.chelvc.framework.common.model.Enumerable;
+import com.chelvc.framework.common.util.ObjectUtils;
 import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.databind.SerializerProvider;
 import com.fasterxml.jackson.databind.ser.std.StdSerializer;
-import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
 
 /**
  * JSON枚举序列化处理器
@@ -31,15 +32,12 @@ public class JacksonEnumerateSerializer extends StdSerializer<Object> {
 
     @Override
     public void serialize(Object value, JsonGenerator generator, SerializerProvider provider) throws IOException {
-        if (value instanceof Enumerable) {
-            Enumerable enumerable = (Enumerable) value;
-            generator.writeObject(ImmutableMap.of(
-                    CODE, String.valueOf(enumerable.getCode()),
-                    DESCRIPTION, String.valueOf(enumerable.getDescription())
-            ));
-        } else if (value instanceof Enum) {
-            Enum<?> enumerable = (Enum<?>) value;
-            generator.writeObject(ImmutableMap.of(CODE, enumerable.name(), DESCRIPTION, enumerable.name()));
+        if (value instanceof Enum) {
+            String name = ((Enum<?>) value).name();
+            Map<String, Object> values = Maps.newHashMap(ObjectUtils.object2map(value));
+            values.putIfAbsent(CODE, name);
+            values.putIfAbsent(DESCRIPTION, name);
+            generator.writeObject(values);
         } else {
             generator.writeObject(value);
         }

+ 0 - 56
framework-common/src/main/java/com/chelvc/framework/common/model/Enumerable.java

@@ -1,56 +0,0 @@
-package com.chelvc.framework.common.model;
-
-import java.io.Serializable;
-
-/**
- * 枚举对象接口
- *
- * @author Woody
- * @date 2024/1/30
- */
-public interface Enumerable extends Serializable {
-    /**
-     * 获取枚举项名称
-     *
-     * @return 枚举项名称
-     */
-    default String name() {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * 获取枚举项顺序
-     *
-     * @return 枚举项顺序
-     */
-    default int ordinal() {
-        return 0;
-    }
-
-    /**
-     * 获取排序数字
-     *
-     * @return 排序数字
-     */
-    default int getOrder() {
-        return this.ordinal();
-    }
-
-    /**
-     * 获取枚举编码
-     *
-     * @return 枚举编码
-     */
-    default String getCode() {
-        return this.name();
-    }
-
-    /**
-     * 获取枚举描述
-     *
-     * @return 枚举描述
-     */
-    default String getDescription() {
-        return this.name();
-    }
-}

+ 1 - 1
framework-common/src/main/java/com/chelvc/framework/common/model/Invoking.java

@@ -9,7 +9,7 @@ import lombok.Getter;
  * @date 2024/11/7
  */
 @Getter
-public enum Invoking implements Enumerable {
+public enum Invoking {
     /**
      * 请求
      */

+ 1 - 1
framework-common/src/main/java/com/chelvc/framework/common/model/Media.java

@@ -15,7 +15,7 @@ import lombok.Getter;
  * @date 2024/1/30
  */
 @Getter
-public enum Media implements Enumerable {
+public enum Media {
     /**
      * 图片
      */

+ 1 - 1
framework-common/src/main/java/com/chelvc/framework/common/model/Platform.java

@@ -9,7 +9,7 @@ import lombok.Getter;
  * @date 2024/1/30
  */
 @Getter
-public enum Platform implements Enumerable {
+public enum Platform {
     /**
      * PC
      */

+ 1 - 1
framework-common/src/main/java/com/chelvc/framework/common/model/Terminal.java

@@ -9,7 +9,7 @@ import lombok.Getter;
  * @date 2024/1/30
  */
 @Getter
-public enum Terminal implements Enumerable {
+public enum Terminal {
     /**
      * Web
      */

+ 4 - 7
framework-common/src/main/java/com/chelvc/framework/common/util/ObjectUtils.java

@@ -509,14 +509,11 @@ public final class ObjectUtils {
             do {
                 Field[] fields = clazz.getDeclaredFields();
                 if (notEmpty(fields)) {
-                    boolean enumerable = clazz.isEnum();
                     for (Field field : fields) {
-                        if (!field.isSynthetic() && ((enumerable && field.isEnumConstant())
-                                || (!enumerable && !Modifier.isStatic(field.getModifiers())))) {
-                            field.setAccessible(true);
-                            if (filter.test(field)) {
-                                return field;
-                            }
+                        if (!field.isSynthetic() && !Modifier.isStatic(field.getModifiers())
+                                && !field.getType().isAnnotationPresent(FunctionalInterface.class)
+                                && filter.test(field)) {
+                            return field;
                         }
                     }
                 }

+ 1 - 2
framework-download/src/main/java/com/chelvc/framework/download/Download.java

@@ -2,7 +2,6 @@ package com.chelvc.framework.download;
 
 import java.io.Serializable;
 
-import com.chelvc.framework.common.model.Enumerable;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.Getter;
@@ -34,7 +33,7 @@ public class Download implements Serializable {
      * 数据处理状态枚举
      */
     @Getter
-    public enum Status implements Enumerable {
+    public enum Status {
         /**
          * 运行中
          */