From 28d072082d297e2d4ff720eba1dcd61c46e830b2 Mon Sep 17 00:00:00 2001 From: fengyuan_yang <1976974459@qq.com> Date: Sun, 20 Sep 2026 09:50:45 +0800 Subject: [PATCH] =?UTF-8?q?2026-09-20=20=E5=BE=85=E6=8A=A5=E4=BB=B7?= =?UTF-8?q?=E6=B8=85=E5=8D=95=E8=B7=B3=E8=BD=AC=E9=94=80=E5=94=AE=E6=8A=A5?= =?UTF-8?q?=E4=BB=B7=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jackson/FlexibleLongListDeserializer.java | 63 +++++++++++++++++++ .../spring/modules/quote/entity/Quote.java | 3 + 2 files changed, 66 insertions(+) create mode 100644 src/main/java/com/spring/common/jackson/FlexibleLongListDeserializer.java diff --git a/src/main/java/com/spring/common/jackson/FlexibleLongListDeserializer.java b/src/main/java/com/spring/common/jackson/FlexibleLongListDeserializer.java new file mode 100644 index 00000000..d32bdf34 --- /dev/null +++ b/src/main/java/com/spring/common/jackson/FlexibleLongListDeserializer.java @@ -0,0 +1,63 @@ +package com.spring.common.jackson; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * 兼容 ids 以 JSON 数组、单个数字或逗号分隔字符串传入。 + */ +public class FlexibleLongListDeserializer extends JsonDeserializer> { + + @Override + public List deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + List result = new ArrayList<>(); + JsonToken token = p.getCurrentToken(); + if (token == JsonToken.VALUE_NULL) { + return null; + } + if (token == JsonToken.VALUE_STRING) { + addAll(result, p.getText()); + return result; + } + if (token == JsonToken.VALUE_NUMBER_INT) { + result.add(p.getLongValue()); + return result; + } + if (token == JsonToken.START_ARRAY) { + while (p.nextToken() != JsonToken.END_ARRAY) { + JsonToken item = p.getCurrentToken(); + if (item == JsonToken.VALUE_NUMBER_INT) { + result.add(p.getLongValue()); + } else if (item == JsonToken.VALUE_STRING) { + addAll(result, p.getText()); + } else if (item == JsonToken.VALUE_NULL) { + continue; + } + } + return result; + } + return result; + } + + private void addAll(List result, String text) { + if (text == null) { + return; + } + String value = text.trim(); + if (value.isEmpty()) { + return; + } + for (String part : value.split("[,\\s]+")) { + if (part == null || part.trim().isEmpty()) { + continue; + } + result.add(Long.valueOf(part.trim())); + } + } +} diff --git a/src/main/java/com/spring/modules/quote/entity/Quote.java b/src/main/java/com/spring/modules/quote/entity/Quote.java index d976ceb7..a523b83f 100644 --- a/src/main/java/com/spring/modules/quote/entity/Quote.java +++ b/src/main/java/com/spring/modules/quote/entity/Quote.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.spring.common.jackson.FlexibleLongListDeserializer; import com.spring.common.utils.QueryPage; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -153,6 +155,7 @@ public class Quote extends QueryPage { private String purchaseName; @TableField(exist = false) + @JsonDeserialize(using = FlexibleLongListDeserializer.class) private List ids; @TableField(exist = false)