@JSONField(serialize = false)
public Map<String, Object> getInternalCache() { return cache; }

用户接口返回体里突然多了一个 internalCache 对象,里面是本地缓存的 Map,连数据库连接串都在。查代码,实体上没有任何叫这个名字的字段。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:Fastjson 按 getter 方法识别属性,getInternalCache() 会被当成 internalCache 输出,和字段名无关。内部状态只要有个 public getter,就会进序列化结果。

「Fastjson 内部字段泄露」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

处理上按这个顺序:给内部 getter 加 @JSONField(serialize = false) 或者在类上指定要输出的字段;把内部状态从实体里移出去 别让 DTO 持有缓存对象;上线前用一条真实响应做字段白名单比对;不要只依赖 @JsonIgnore Fastjson 认的是自己的注解。

确认没问题再收工,响应体里不再出现 internalCache 用字段白名单比对没有多余键。

作者 9823189