feat(entity): 为工单实体添加附件字段的JSON序列化处理
- 在AppTicket和AppTicketReply实体中添加JsonArrayToStringDeserializer和JsonStringToArraySerializer注解 - 实现附件字段在数据库存储时从数组转换为JSON字符串 - 实现附件字段向前端响应时从JSON字符串转换为数组格式 - 添加JsonArrayToStringDeserializer类处理数组到字符串的反序列化 - 添加JsonStringToArraySerializer类处理字符串到数组的序列化 - 移除CMS网站映射器中的软删除条件过滤
This commit is contained in:
@@ -4,6 +4,10 @@ import com.baomidou.mybatisplus.annotation.IdType;
|
||||
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.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.gxwebsoft.common.core.config.JsonArrayToStringDeserializer;
|
||||
import com.gxwebsoft.common.core.config.JsonStringToArraySerializer;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
@@ -53,6 +57,8 @@ public class AppTicket implements Serializable {
|
||||
private String status;
|
||||
|
||||
@Schema(description = "附件JSON数组")
|
||||
@JsonDeserialize(using = JsonArrayToStringDeserializer.class)
|
||||
@JsonSerialize(using = JsonStringToArraySerializer.class)
|
||||
private String attachments;
|
||||
|
||||
@Schema(description = "提交人用户ID")
|
||||
|
||||
@@ -4,6 +4,10 @@ import com.baomidou.mybatisplus.annotation.IdType;
|
||||
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.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.gxwebsoft.common.core.config.JsonArrayToStringDeserializer;
|
||||
import com.gxwebsoft.common.core.config.JsonStringToArraySerializer;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
@@ -35,6 +39,8 @@ public class AppTicketReply implements Serializable {
|
||||
private String content;
|
||||
|
||||
@Schema(description = "附件JSON数组")
|
||||
@JsonDeserialize(using = JsonArrayToStringDeserializer.class)
|
||||
@JsonSerialize(using = JsonStringToArraySerializer.class)
|
||||
private String attachments;
|
||||
|
||||
@Schema(description = "回复人用户ID")
|
||||
|
||||
@@ -435,7 +435,7 @@
|
||||
a.user_id = #{param.memberUserId}
|
||||
OR a.website_id IN (
|
||||
SELECT au.website_id FROM app_user au
|
||||
WHERE au.user_id = #{param.memberUserId} AND au.deleted = 0
|
||||
WHERE au.user_id = #{param.memberUserId}
|
||||
)
|
||||
)
|
||||
</if>
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
package com.gxwebsoft.common.core.config;
|
||||
|
||||
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 com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* JSON 数组 ↔ String 反序列化器
|
||||
* <p>
|
||||
* 数据库字段存储的是 JSON 字符串(如 ["url1","url2"]),
|
||||
* 前端传来的是 JSON 数组;此反序列化器把两种形式都正确处理为 String 存库。
|
||||
*
|
||||
* @author WebSoft
|
||||
* @since 2026-03-30
|
||||
*/
|
||||
@Slf4j
|
||||
public class JsonArrayToStringDeserializer extends JsonDeserializer<String> {
|
||||
|
||||
private static final ObjectMapper MAPPER = new ObjectMapper();
|
||||
|
||||
@Override
|
||||
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
|
||||
// 如果前端传的已经是字符串,直接返回
|
||||
if (p.currentToken() == JsonToken.VALUE_STRING) {
|
||||
String text = p.getText();
|
||||
if (text == null || text.trim().isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
return text;
|
||||
}
|
||||
// 如果前端传的是数组,序列化成 JSON 字符串
|
||||
if (p.currentToken() == JsonToken.START_ARRAY) {
|
||||
List<String> list = MAPPER.readValue(p, MAPPER.getTypeFactory()
|
||||
.constructCollectionType(List.class, String.class));
|
||||
if (list == null || list.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
return MAPPER.writeValueAsString(list);
|
||||
}
|
||||
// null
|
||||
if (p.currentToken() == JsonToken.VALUE_NULL) {
|
||||
return null;
|
||||
}
|
||||
return p.getValueAsString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getNullValue(DeserializationContext ctxt) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.gxwebsoft.common.core.config;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonGenerator;
|
||||
import com.fasterxml.jackson.databind.JsonSerializer;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* JSON 字符串 → 数组 序列化器
|
||||
* <p>
|
||||
* 数据库中 attachments 存储为 JSON 字符串,响应给前端时自动转成数组。
|
||||
*
|
||||
* @author WebSoft
|
||||
* @since 2026-03-30
|
||||
*/
|
||||
@Slf4j
|
||||
public class JsonStringToArraySerializer extends JsonSerializer<String> {
|
||||
|
||||
private static final ObjectMapper MAPPER = new ObjectMapper();
|
||||
|
||||
@Override
|
||||
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
|
||||
if (value == null || value.trim().isEmpty()) {
|
||||
gen.writeStartArray();
|
||||
gen.writeEndArray();
|
||||
return;
|
||||
}
|
||||
try {
|
||||
List<String> list = MAPPER.readValue(value,
|
||||
MAPPER.getTypeFactory().constructCollectionType(List.class, String.class));
|
||||
gen.writeObject(list);
|
||||
} catch (Exception e) {
|
||||
// 解析失败(非JSON格式)就把原始字符串包成单元素数组
|
||||
log.warn("attachments 字段不是合法 JSON 数组,原样包装: {}", value);
|
||||
gen.writeStartArray();
|
||||
gen.writeString(value);
|
||||
gen.writeEndArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user