Jackson 3 升级后 is1Foo 字段消失,检查 getter 命名规则
Jackson 3 默认不再把 is 后接数字的 getter 自动识别为属性。为既有 JSON 契约加显式 JsonProperty,或有范围地放宽 accessor 命名策略。
升级 Jackson 3 后,同一个对象原先输出 {"1Foo":false,"oneFoo":false},现在只剩 {"oneFoo":false}。如果缺少的属性来自 is1Foo() 这样的 getter,要先检查自动识别规则;它不一定是 false 被过滤,也不一定是 mapper 配置没生效。
Jackson 3 收紧了默认的 accessor 命名规则:去掉 is、get、set 前缀后,属性基名需要满足默认首字符规则。isOneFoo() 可以自动识别,is1Foo() 的基名以数字开头,默认不会再按同一方式识别。这是 3.0 的有意行为变化,不能当作等待一个补丁就会恢复的偶发故障。
先判断属性是没被发现,还是被排除了
下面这个 getter 在 Java 语法上合法,但并不满足 Jackson 3 的默认自动识别条件:
public boolean is1Foo() {
return flag;
}
这里 flag 是类中已有的 boolean 字段。对照同一个 mapper 的输出,把值分别设成 true、false;若两种值都没有该属性,再看 getter 发现规则。只有 false 不输出时,还要检查 JsonInclude、视图、过滤器或自定义 serializer,不能只因升级了大版本就套用本题。
同样检查 HTTP 层实际使用的 mapper。Spring Boot 4 的默认 JsonMapper 与自定义 Bean可能不是同一对象;但若直接用同一份 Jackson 3 mapper 也稳定漏掉数字开头的 getter,应处理命名契约本身。
少量历史字段,明确写出 JSON 属性名
要保留已有接口中的 1Foo,可以在 getter 上声明属性,而不是依赖自动推导:
import com.fasterxml.jackson.annotation.JsonProperty;
@JsonProperty("1Foo")
public boolean is1Foo() {
return flag;
}
Jackson 3 的 databind 已迁移到 tools.jackson,但 JsonProperty 注解仍使用 com.fasterxml.jackson.annotation 包,不要凭包名前缀就把它替换成不存在的类。
双向读写的 DTO 还要明确对应输入入口。若原 setter 也是 set1Foo(boolean value),可以给该 setter 同样标注 @JsonProperty("1Foo");采用构造器或 record 时,应按其既有创建方式指定同一 JSON 名称。只修 getter,不能顺便认定反序列化已经保持兼容。
这通常比重命名对外字段更容易控制影响。直接把 getter 改名,可能同时改变 JSON 属性名、Java 调用点或生成代码契约,应按接口变更处理。
大量既有方法,可以有范围地放宽规则
若确实需要兼容一批数字或其他非字母开头的基名,可在现有 JsonMapper builder 上加入命名策略。下面是可独立理解的 Jackson 3 配置示例;整合时保留项目原有模块、特性和命名设置:
import tools.jackson.databind.introspect.DefaultAccessorNamingStrategy;
import tools.jackson.databind.json.JsonMapper;
JsonMapper mapper = JsonMapper.builder()
.accessorNaming(new DefaultAccessorNamingStrategy.Provider()
.withFirstCharAcceptance(false, true))
.build();
两个参数依次表示允许小写首字母、允许非字母首字符。这里仅打开后一项,不会完全恢复所有 Jackson 2 的宽松规则。true, true 还会允许小写开头,可能让此前没打算暴露的方法被当作属性,不能为了一个字段全局打开。
策略应加入真正用于该接口的 mapper。另建一份示例 mapper、测试成功,却让 HTTP 转换器继续使用默认实例,不会修复实际响应。
验收保留原 JSON 字段名,覆盖 true、false、普通 isOneFoo()、输入到输出往返,以及其他同类 getter。检查没有多出意外属性或两个名称指向同一字段。若采用全局策略,还需观察其他 DTO 的输出差异;需要撤回时恢复策略或注解及其配套契约,不依靠升级把这项有意变化自动还原。


