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)