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

如何实现@JsonIgnore仅在响应时忽略密码,请求时正常解析?

解决@JsonIgnore导致POST请求密码无法解析的问题

这问题我之前开发用户模块时也踩过坑!你遇到的核心问题是@JsonIgnore会同时禁用序列化(将对象转为JSON返回给前端)和反序列化(将前端传的JSON转为后端对象),所以新增用户时请求里的password字段根本没法被解析到UserDto中,自然就会出现空指针异常。

下面给你两种可行的解决方案,优先推荐第一种:

方案一:使用@JsonProperty的WRITE_ONLY属性

这是最简洁优雅的方式,直接通过@JsonProperty指定字段的访问权限为仅写入,这样既保证接收请求时能解析密码,又能在返回响应时隐藏它。

修改后的UserDto代码如下:

public class UserDto {
    private String username;
    
    // 指定该字段仅允许反序列化(写入),序列化(读出)时忽略
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password;

    // 记得添加必要的getter和setter,Jackson需要通过它们处理属性
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

这样调整后:

  • 调用POST /addAccount接口时,请求体里的password会正常被解析到UserDto中;
  • 返回用户详情时,JSON响应里不会包含password字段,完全符合你的需求。

方案二:@JsonIgnore与@JsonProperty配合使用

如果你的Jackson版本比较旧(不过现在Spring Boot项目基本都不会有这问题),可以用这种方式,通过分别标注getter和setter来控制序列化和反序列化:

public class UserDto {
    private String username;
    
    @JsonIgnore
    private String password;

    // 反序列化时,让Jackson识别这个setter对应的"password"字段
    @JsonProperty("password")
    public void setPassword(String password) {
        this.password = password;
    }

    // 序列化时,忽略这个getter,避免返回password
    @JsonIgnore
    public String getPassword() {
        return password;
    }

    // username的getter和setter正常实现
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

这种方式本质上是通过注解拆分了读写权限,效果和方案一一致,但代码相对繁琐一些,所以更推荐方案一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:57:36