You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3.1.4升级后Jackson @JsonGetter注解失效问题

问题分析与解决方案

核心问题

升级到Spring Boot 3.1.4后,尽管Jackson版本仍为2.15.2,但带有Lombok @Builder的Record类中,@JsonGetter注解定义的枚举属性序列化逻辑失效,序列化后返回枚举原始大写值而非自定义的小写形式。

可能原因

Spring Boot 3.1.4对Jackson处理Record的自动配置逻辑做了调整——Jackson在处理Record类型时,优先使用Record自动生成的无get前缀的属性访问方法(如myAttribute()),而非自定义的带get前缀的getMyAttribute()方法,导致自定义序列化逻辑被忽略。

可行解决方案

方案1:给枚举类添加@JsonValue注解(推荐)

直接在枚举类中定义统一的序列化规则,无需修改Record代码,所有该枚举的序列化都会自动转为小写:

public enum MyAttributeEnum {
    TEST, EXAMPLE;

    @JsonValue
    public String toLowerCase() {
        return this.name().toLowerCase();
    }
}

方案2:用@JsonProperty明确指定属性映射

在自定义的get方法上添加@JsonProperty,强制Jackson将该方法的返回值映射到myAttribute字段:

@Builder
public record MyRecord(MyAttributeEnum myAttribute) {

    @JsonProperty("myAttribute")
    public String getMyAttribute() {
        return myAttribute.name().toLowerCase();
    }
}

方案3:调整Jackson配置,修改Record处理逻辑

在application.properties中添加配置,禁用Jackson的USE_GETTERS_AS_SETTERS特性,避免优先选择Record的默认访问方法:

spring.jackson.mapper.use-getters-as-setters=false

方案4:修正测试逻辑(若测试存在误解)

若你的测试是直接访问Record的myAttribute()方法(返回枚举实例)而非序列化后的结果,需调整测试为验证序列化后的JSON字段值:

def "验证MyRecord序列化结果"() {
    given:
    def givenAttr = MyAttributeEnum.TEST
    def myRecord = MyRecord.builder().myAttribute(givenAttr).build()
    def objectMapper = new ObjectMapper()

    when:
    def jsonNode = objectMapper.readTree(objectMapper.writeValueAsString(myRecord))

    then:
    jsonNode.get("myAttribute").asText() == givenAttr.name().toLowerCase()
}

内容的提问来源于stack exchange,提问作者Srilalitha S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:00:06