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

Spring Boot中@JsonProperty(WRITE_ONLY)注解字段不生效问题求助

问题分析与解决方案

你遇到的问题主要和Jackson序列化逻辑、代码细节有关,分两种场景处理:

场景1:接口返回的JSON里包含password

Jackson默认通过调用类的getter方法生成JSON字段,你只在password字段上添加了@JsonProperty(access = WRITE_ONLY),但对应的getPassword()方法没有注解限制,Jackson依然会序列化这个属性。

解决方法很简单,把注解加到getPassword()方法上,或者同时保留字段和getter上的注解:

@NotBlank
@Size(min = 8)
@Column(name = "password")
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String password;

// 给getter方法加上同样的注解
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
public String getPassword() {
    return password;
}

或者直接在getPassword()上用@JsonIgnore,这样序列化时会直接忽略该属性,且不影响注册时的反序列化(Jackson依然会调用setPassword()接收请求参数)。

场景2:日志/控制台打印时看到password

你的toString()方法里硬编码了password字段,所以打印User对象时会显示密码。这种情况修改toString()即可:

@Override
public String toString() {
    return "User{" + "id=" + id + ", name='" + name + '\'' + ", email='" + email + '\'' + '}';
}

更规范的长期方案:使用DTO分离场景

用同一个实体类兼顾输入输出不是最佳实践,推荐用DTO(数据传输对象)拆分:

  • 注册时用RegisterUserDTO:包含name、email、password三个字段,做参数校验
  • 返回用户详情时用UserResponseDTO:只包含id、name、email三个字段
  • 业务层负责在DTO和实体类之间转换,比如用MapStruct工具自动生成转换代码,避免手动写冗余代码

这样不仅能彻底避免字段泄露问题,还能让代码职责更清晰,符合分层架构设计。

内容的提问来源于stack exchange,提问作者ShadowLeaf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:24:52