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
相关产品推荐
相关产品推荐

