使用Lombok时,含has前缀布尔字段的请求参数无法正确绑定问题
解决Jackson反序列化has开头布尔字段为null的问题
你遇到的问题是Jackson反序列化时,无法将JSON中hasName: true的值正确映射到Payload类的name字段,导致字段值为null。核心原因是Jackson对布尔类型字段的命名规则与Lombok生成的getter/setter不匹配:
- JSON字段是
hasName,Jackson会默认寻找名为hasName()或isName()的getter/setter方法; - 但你的字段名是
name,Lombok的@Data注解生成的getter是getName(),setter是setName(Boolean),Jackson无法将这些方法与hasName字段关联,因此无法完成赋值。
解决方案1:统一字段名与JSON键名
直接将类中的字段名改为hasName,让字段名与JSON键名完全一致,Jackson可以自动匹配,无需额外注解:
@Data @Builder @AllArgsConstructor @NoArgsConstructor public class Payload { private Boolean hasName; // 其他字段... }
这种方式最简洁,也符合常规的命名规范,推荐优先使用。
解决方案2:保留原字段名,通过注解绑定映射关系
如果不想修改字段名,可以通过以下两种方式调整Jackson的映射规则:
方式2.1:为getter/setter添加@JsonProperty注解
利用Lombok的@Getter/@Setter的onMethod_参数,为生成的getter和setter添加@JsonProperty("hasName"),明确告诉Jackson该方法对应JSON的hasName字段:
@Data @Builder @AllArgsConstructor @NoArgsConstructor public class Payload { @Getter(onMethod_ = {@JsonProperty("hasName")}) @Setter(onMethod_ = {@JsonProperty("hasName")}) private Boolean name; // 其他字段... }
也可以手动编写getter/setter并添加注解(会覆盖Lombok生成的方法):
@Data @Builder @AllArgsConstructor @NoArgsConstructor public class Payload { private Boolean name; @JsonProperty("hasName") public Boolean getName() { return name; } @JsonProperty("hasName") public void setName(Boolean name) { this.name = name; } // 其他字段... }
方式2.2:使用@JsonAlias指定别名
@JsonAlias允许Jackson在反序列化时将指定的JSON键名映射到类字段,适合只需要反序列化匹配的场景:
@Data @Builder @AllArgsConstructor @NoArgsConstructor public class Payload { @JsonAlias("hasName") private Boolean name; // 其他字段... }
注意:如果需要序列化时输出hasName而不是name,仍然需要配合@JsonProperty("hasName")使用。
内容的提问来源于stack exchange,提问作者Aniii Ani
相关产品推荐
相关产品推荐

