Spring Boot中如何让Jackson保留属性名的前导下划线
问题原因
出现重复字段的核心原因是Jackson默认同时序列化带@JsonProperty注解的私有字段和符合JavaBean命名规范的public getter方法:
- 私有字段
_links加了@JsonProperty("_links"),会被序列化为_links - public getter
getLinks()没有指定序列化名称,会按JavaBean规则序列化为links
两者同时生效就出现了两个内容相同、名称不同的属性,你之前尝试的命名策略配置是全局统一修改属性命名规则,无法解决这种字段和getter不匹配导致的重复序列化问题。
解决方案
方案1:Spring Boot全局配置Jackson(最简,无需修改生成代码)
直接在application.yml或application.properties中添加如下配置,关闭Jackson对无注解getter/setter的自动检测:
spring: jackson: mapper: AUTO_DETECT_GETTERS: false AUTO_DETECT_SETTERS: false
配置后Jackson只会序列化带@JsonProperty注解的字段/getter,不会自动把getLinks()识别为links属性,完美保留你需要的_links属性名。
方案2:调整swagger-codegen生成规则(治本,避免后续生成代码重复出现问题)
修改swagger-codegen的构建配置,开启getter方法的JsonProperty注解生成能力,以maven插件为例:
<configuration> <additionalProperties> <jacksonAnnotation>true</jacksonAnnotation> <generateJsonPropertyForGetters>true</generateJsonPropertyForGetters> </additionalProperties> </configuration>
配置后重新生成的代码中,getLinks()方法会自动带上@JsonProperty("_links")注解,Jackson会把getter也映射到_links字段,不会生成多余的links属性。
方案3:临时手动修改生成代码
如果只需要快速验证效果,可以直接给生成的get方法添加@JsonIgnore注解,让Jackson忽略这个getter:
@Schema( description = "" ) @Valid @JsonIgnore public LinksUnderscoreType getLinks() { return this._links; }
该方案每次重新生成代码都需要手动修改,适合临时调试使用。
内容的提问来源于stack exchange,提问作者Jeroen Kransen
相关产品推荐
相关产品推荐

