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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:15:00