Architecture
ddd4j-jackson
|
|
编码 DDD4J 项目中 Jackson 的使用规则。LLM 训练数据中的 Jackson 用法会与项目约定冲突。
LLM 会用 ISO-8601 格式 2024-03-15T10:30:00Z 序列化日期——DDD4J 要求 2024-03-15 10:30:00。LLM 不会给 null 数组返回 []——DDD4J 前端期望 null 数组永远不出现。这些规则 LLM 不知道。
| # | 错误 | 正确做法 |
|---|------|---------|
| 1 | 日期用 ISO-8601 2024-03-15T10:30:00Z | 用 yyyy-MM-dd HH:mm:ss |
| 2 | null 数组返回 null | 返回 [] |
| 3 | null 字符串返回 null | 返回 "" |
| 4 | 给 null 数字返回 0 | 数字/布尔保持 null,不转化 |
| 5 | 手动写脱敏逻辑 | 用 @Sensitive(strategy = SensitiveStrategy.PHONE) |
| 6 | 缓存用 Web ObjectMapper | 用 JacksonKit(DefaultTyping.NON_FINAL + ALL visibility) |
| 7 | 大数字直接返回 Long | 用 ToLongDeserializer 处理精度丢失 |
// ❌ 错误:LLM会这样写
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
private LocalDateTime createTime;
// ✅ 正确:DDD4J 已全局配置
private LocalDateTime createTime; // 序列化为 "2024-03-15 10:30:00"
// ✅ Null 处理:前端收到的 JSON
// null 数组 → [] (默认开启)
// null 字符串 → "" (默认开启)
// null 对象 → {} (默认开启)
// null 数字 → null (不转化)
// null 布尔 → null (不转化)
// ✅ 敏感数据脱敏
public class UserVO {
@Sensitive(strategy = SensitiveStrategy.PHONE)
private String phone; // 185****1653
@Sensitive(strategy = SensitiveStrategy.ID_CARD)
private String idCard; // 1234****5678
@Sensitive(strategy = SensitiveStrategy.USERNAME)
private String name; // 张*三
@Sensitive(strategy = SensitiveStrategy.EMAIL)
private String email; // r*****[email protected]
@Sensitive(strategy = SensitiveStrategy.ADDRESS)
private String address; // 北京市****海淀区****
}
// ✅ 两个 ObjectMapper
// Web用:JacksonAutoConfiguration 自动配置的,用于 HTTP 请求响应
@Autowired private ObjectMapper objectMapper;
// 缓存用:JacksonKit 独立 ObjectMapper,带 DefaultTyping.NON_FINAL
JacksonKit.toJson(obj); // 序列化时写入类型信息
JacksonKit.fromJson(json, Type.class); // 反序列化时根据类型信息恢复
"1234567890123456789" 也能正确解析yyyy-MM-dd HH:mm:ss本技能不收集、存储或传输任何用户数据。@Sensitive 注解仅用于在序列化时脱敏已存在的敏感数据。