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
相关产品推荐
相关产品推荐

