Spring Boot项目中使用Jackson映射时出现属性Getter定义冲突的问题解决咨询
嘿,这个问题我之前踩过坑!本质是Jackson自动识别属性的逻辑和你手动指定的@JsonProperty注解闹矛盾了。Jackson默认会根据Getter方法名推断对应的JSON属性,但你给字段加的@JsonProperty(比如"TSContact")和另一个字段的Getter(getLocationContact)被Jackson错误关联到了同一个属性上——大概率是默认命名策略对大小写、前缀的处理搞混了。
给你几个靠谱的解决办法:
方案1:把@JsonProperty移到Getter上
直接把注解从字段搬到对应的Getter方法,明确告诉Jackson每个Getter对应哪个JSON属性,彻底消除歧义:
@Getter @Setter public class MyClassDto { private List<Contact> tsContact = new ArrayList<>(); private List<Contact> locationContact = new ArrayList<>(); @JsonProperty("TSContact") public List<Contact> getTsContact() { return tsContact; } @JsonProperty("LocationContact") public List<Contact> getLocationContact() { return locationContact; } }
方案2:配置Jackson的命名策略
如果不想逐个改注解,直接给Jackson指定合适的命名策略就行。在Spring Boot里,直接在application.properties加一行:
spring.jackson.property-naming-strategy=PASCAL_CASE_TO_CAMEL_CASE
要是你用自定义的ObjectMapper,就这么写:
ObjectMapper mapper = new ObjectMapper(); mapper.setPropertyNamingStrategy(PropertyNamingStrategy.PASCAL_CASE_TO_CAMEL_CASE);
这个策略会自动把JSON里的帕斯卡命名(比如TSContact)转换成Java的驼峰命名(tsContact),刚好匹配你的字段名,Jackson就能正确对应Getter和属性了。
方案3:用@JsonIgnore临时规避(不推荐)
如果只是临时救急,可以给其中一个Getter加@JsonIgnore,但注意这会让对应的属性无法被序列化/反序列化,只适合特殊场景:
@Getter @Setter public class MyClassDto { @JsonProperty("TSContact") private List<Contact> tsContact = new ArrayList<>(); @JsonProperty("LocationContact") @JsonIgnore // 注意:加了这个,locationContact就不会被Jackson处理了 private List<Contact> locationContact = new ArrayList<>(); }
小提醒:检查Lombok生成的方法
你用了Lombok的@Getter @Setter,最好确认下编译后的class文件里,Getter的命名是不是getTsContact和getLocationContact——要是Lombok生成的方法名不符合预期,也会让Jackson认错属性。
内容的提问来源于stack exchange,提问作者Francesco Centrone

