news 2026/5/12 21:46:42

SpringBoot @JsonIgnore 忽略字段,但也不会接收使用@JsonProperty(access = JsonProperty.Access.WRITE_ONLY) 解决只接收不返回。

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot @JsonIgnore 忽略字段,但也不会接收使用@JsonProperty(access = JsonProperty.Access.WRITE_ONLY) 解决只接收不返回。

Spring Boot 中字段序列化与反序列化的精准控制:从 @JsonIgnore 到 @JsonProperty

在 Spring Boot 开发中,处理 JSON 数据时经常遇到一个痛点:如何精确控制字段的“输入”与“输出”。很多时候,我们希望某个字段在返回给前端时被隐藏(如密码、内部ID),但在接收前端提交的数据时又需要能够被赋值。简单地使用@JsonIgnore往往会导致“一刀切”,既忽略了返回,也阻断了接收。本文将深入探讨这一问题的根源,并展示如何使用@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)实现更精细的控制。

为什么 @JsonIgnore 不够用?

Jackson 是 Spring Boot 默认的 JSON 处理库。@JsonIgnore注解的作用非常直观:它告诉 Jackson 在序列化(对象转 JSON)和反序列化(JSON 转对象)过程中都忽略该字段。

publicclassUser{privateStringusername;@JsonIgnoreprivateStringpassword;}

在上述代码中,当我们将User对象转换为 JSON 返回给客户端时,password字段确实不会出现在 JSON 字符串中。然而,这也带来了一个副作用:如果客户端在注册或修改密码时提交了password字段,Spring MVC 在将 JSON 绑定到User对象时,也会直接忽略这个字段。这意味着后端永远无法通过标准的数据绑定机制接收到这个值。

这在以下场景中是不可接受的:

  1. 用户注册/登录:前端需要发送密码,但后端不应在响应中回显密码。
  2. 敏感信息更新:如重置密码、修改安全邮箱等,需要接收新值但不希望旧值或新值在查询接口中泄露。

解决方案:@JsonProperty(access = …)

为了解决上述问题,Jackson 提供了@JsonProperty注解的access属性。通过设置不同的访问模式,我们可以独立控制字段的读取(序列化)和写入(反序列化)行为。

核心属性说明

枚举值含义适用场景
READ_WRITE默认值,既可读也可写普通业务字段
READ_ONLY仅可读(序列化),不可写(反序列化)计算字段、内部状态标识
WRITE_ONLY仅可写(反序列化),不可读(序列化)密码、秘密令牌、一次性验证码

实战示例:只接收不返回

针对前文提到的密码场景,正确的做法是使用WRITE_ONLY

importcom.fasterxml.jackson.annotation.JsonProperty;publicclassUserDTO{privateStringusername;/** * WRITE_ONLY 表示: * 1. 反序列化时:JSON 中的 "password" 会被映射到此字段。 * 2. 序列化时:此字段不会被包含在生成的 JSON 中。 */@JsonProperty(access=JsonProperty.Access.WRITE_ONLY)privateStringpassword;// getters and setterspublicStringgetUsername(){returnusername;}publicvoidsetUsername(Stringusername){this.username=username;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}}
行为验证
  1. 接收数据(POST /register)
    • 请求体:{"username": "john", "password": "secret123"}
    • 结果:UserDTO对象的password字段成功被赋值为"secret123"
  2. 返回数据(GET /user/profile)
    • 响应体:{"username": "john"}
    • 结果:password字段完全不出现在 JSON 中,即使对象内部持有该值。

进阶建议:结合其他注解增强安全性

虽然WRITE_ONLY解决了基本的传输层隔离,但在实际生产中,还需注意以下几点:

1. 日志脱敏

即使 JSON 中不包含密码,如果开发者不小心将对象打印到日志中(如log.info("Received user: {}", user)),toString()方法可能会泄露敏感信息。建议重写toString()或使用专门的日志脱敏工具。

2. 数据库持久化隔离

确保在 ORM 框架(如 JPA/Hibernate)中也做了相应配置。例如,在使用@Entity时,如果password字段同时用于数据库存储,需确保其加密逻辑正确,且不要在查询所有用户列表时意外加载明文密码。

3. 区分 READ_ONLY 场景

对于某些字段,如createdAt(创建时间),我们通常希望它在创建后由后端生成,前端不应也无法修改。此时应使用READ_ONLY

@JsonProperty(access=JsonProperty.Access.READ_ONLY)privateLocalDateTimecreatedAt;

这样,前端提交的createdAt将被忽略,而后端返回时会包含该字段。

总结

在 Spring Boot 中处理 JSON 字段可见性时,不要盲目使用@JsonIgnore@JsonIgnore是双向屏蔽,而@JsonProperty(access = ...)提供了单向控制的灵活性。

  • 如果需要完全隐藏字段(既不接收也不返回),使用@JsonIgnore
  • 如果需要接收但不返回(如密码),使用@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
  • 如果需要返回但不接收(如系统生成 ID),使用@JsonProperty(access = JsonProperty.Access.READ_ONLY)
    掌握这些细微差别,不仅能提升 API 的安全性,还能避免许多因数据绑定失败导致的隐蔽 Bug。- - - 3. - 2. * * * 3.
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/12 21:45:34

C# 实时查看硬件使用率(CPU 内存 硬盘 网络)

一、整体架构 ┌─────────────────────────────────────────────────────────────┐ │ 硬件资源监控系统 │ ├────────────────────────…

作者头像 李华
网站建设 2026/5/12 21:43:28

Redis Set:原理、命令与实战场景详解

Redis 数据结构精讲:Set 集合的原理、命令与实战场景 大家好,今天我们来聊聊 Redis 中一个非常实用的数据结构 ——Set(集合)。它和我们熟悉的列表(List)有很多相似之处,比如都能存储多个字符串…

作者头像 李华
网站建设 2026/5/12 21:39:07

别让查重和AI率卡住你的毕业!百考通AI的精准解决方案

每到毕业季,总有一场无声的战役悄然打响——它不是论文开题的迷茫,也不是数据收集的奔波,而是最后那道看似技术性、却足以让无数人熬红双眼的关卡:论文查重与AIGC检测。你是否也经历过这些场景:对着知网飘红的报告逐字…

作者头像 李华
网站建设 2026/5/12 21:37:15

转码使用教程

转换小程序使用说明 使用功能列表使用方式: 发送url链接/小程序分享/固定格式(微信小卡片)即可进行转换 链接生成二维码 条件:http或者https开头的链接小程序转普通二维码/详细信息/MP短链/小程序链/小程序码MP短链转普通二维码/详细信息/小程序链/小程序…

作者头像 李华
网站建设 2026/5/12 21:35:09

对比按量计费与TokenPlan套餐在长期项目中的成本观测差异

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比按量计费与TokenPlan套餐在长期项目中的成本观测差异 在持续数月的AI应用开发项目中,成本的可预测性与可控性是团队…

作者头像 李华
网站建设 2026/5/12 21:34:15

坏了,黑客学会用AI写外挂了

昨天刚聊完程序员为了省那23万Token账单连夜跑路的事儿,今天又出大事了。 而且这次不是钱包的问题——是有人在用AI造“数字万能钥匙”,想捅谁家窗户就捅谁家窗户。 听完你可能会想把家里智能门锁也换成铁锁头。 连坏人都开始用AI打工了?凌晨…

作者头像 李华