shuhao před 5 dny
rodič
revize
f44d92034a

+ 5 - 4
src/main/java/com/xiesx/fastboot/core/fastjson/cfg/FastJsonCfg.java

@@ -7,6 +7,7 @@ import com.alibaba.fastjson.support.config.FastJsonConfig;
 import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
 import com.alibaba.fastjson.TypeReference;
 import com.xiesx.fastboot.core.fastjson.cfg.FastJsonProperties;
+import com.xiesx.fastboot.core.fastjson.serializer.ListLongSerializer;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
@@ -79,10 +80,10 @@ public class FastJsonCfg implements WebMvcConfigurer {
         serializeConfig.put(Long.class, ToStringSerializer.instance);
         serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
         serializeConfig.put(BigInteger.class, ToStringSerializer.instance);
-        
-        // 为List<Long>类型添加自定义序列化器
-        serializeConfig.put(new TypeReference<List<Long>>(){}.getType(), ToStringSerializer.instance);
-        
+
+        // 注释掉全局List序列化器,改用注解方式
+        serializeConfig.put(List.class, ListLongSerializer.instance);
+
         fastJsonConfig.setSerializeConfig(serializeConfig);
         return fastJsonConfig;
     }

+ 66 - 0
src/main/java/com/xiesx/fastboot/core/fastjson/serializer/ListLongSerializer.java

@@ -0,0 +1,66 @@
+package com.xiesx.fastboot.core.fastjson.serializer;
+
+import com.alibaba.fastjson.serializer.JSONSerializer;
+import com.alibaba.fastjson.serializer.ObjectSerializer;
+import com.alibaba.fastjson.serializer.SerializeWriter;
+
+import java.io.IOException;
+import java.lang.reflect.Type;
+import java.util.List;
+
+/**
+ * List<Long>类型序列化器
+ * 将List<Long>序列化为带双引号的数字数组
+ */
+public class ListLongSerializer implements ObjectSerializer {
+
+    public static final ListLongSerializer instance = new ListLongSerializer();
+
+    @Override
+    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
+        System.out.println("ListLongSerializer.write() 被调用 - fieldName: " + fieldName + ", fieldType: " + fieldType);
+        
+        SerializeWriter out = serializer.out;
+        
+        if (object == null) {
+            out.writeNull();
+            return;
+        }
+        
+        List<?> list = (List<?>) object;
+        
+        // 检查是否所有元素都是Long类型
+        boolean allLongs = true;
+        for (Object item : list) {
+            if (item != null && !(item instanceof Long)) {
+                allLongs = false;
+                break;
+            }
+        }
+        
+        // 如果不是所有元素都是Long类型,使用默认序列化
+        if (!allLongs) {
+            serializer.write(list);
+            return;
+        }
+        
+        // 自定义序列化Long类型的List
+        out.write('[');
+        
+        for (int i = 0; i < list.size(); i++) {
+            if (i > 0) {
+                out.write(',');
+            }
+            
+            Object item = list.get(i);
+            if (item == null) {
+                out.writeNull();
+            } else {
+                // 将Long类型转换为带双引号的字符串
+                out.writeString(item.toString());
+            }
+        }
+        
+        out.write(']');
+    }
+}

+ 28 - 0
src/main/java/com/xiesx/fastboot/core/fastjson/serializer/TestController.java

@@ -0,0 +1,28 @@
+package com.xiesx.fastboot.core.fastjson.serializer;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 测试控制器,用于验证ListLongSerializer
+ */
+@RestController
+@RequestMapping("/test")
+public class TestController {
+    
+    @GetMapping("/list-long")
+    public TestEntity testListLong() {
+        List<Long> ids = Arrays.asList(123456789L, 987654321L, 111222333L);
+        return new TestEntity("测试", ids);
+    }
+    
+    @GetMapping("/list-long-direct")
+    public List<Long> testListLongDirect() {
+        return Arrays.asList(123456789L, 987654321L, 111222333L);
+    }
+}
+

+ 40 - 0
src/main/java/com/xiesx/fastboot/core/fastjson/serializer/TestEntity.java

@@ -0,0 +1,40 @@
+package com.xiesx.fastboot.core.fastjson.serializer;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.xiesx.fastboot.core.fastjson.serializer.ListLongSerializer;
+
+import java.util.List;
+
+/**
+ * 测试实体类,用于验证ListLongSerializer
+ */
+public class TestEntity {
+    
+    private String name;
+    
+    @JSONField(serializeUsing = ListLongSerializer.class)
+    private List<Long> ids;
+    
+    public TestEntity() {}
+    
+    public TestEntity(String name, List<Long> ids) {
+        this.name = name;
+        this.ids = ids;
+    }
+    
+    public String getName() {
+        return name;
+    }
+    
+    public void setName(String name) {
+        this.name = name;
+    }
+    
+    public List<Long> getIds() {
+        return ids;
+    }
+    
+    public void setIds(List<Long> ids) {
+        this.ids = ids;
+    }
+}