使用 @JsonProperty
的 access
属性
如果您希望实现更精细的控制,比如"允许接收前端数据,但不返回给前端",可以使用 @JsonProperty
的 access
属性。这是最优雅和专业的解决方案
java
import com.fasterxml.jackson.annotation.JsonProperty;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String deptId;
- •
WRITE_ONLY
:表示该字段仅在反序列化 (写入对象,即接收前端数据)时有效,在序列化 (读出对象,即返回给前端)时会被忽略
。
分别在 Getter 和 Setter 方法上使用注解
如果您的业务逻辑非常特殊,还可以选择将注解分别加在方法上,实现更精确的控制
java
private String deptId; // 序列化时忽略(不返回给前端)
@JsonIgnore
public String getDeptId()
{
return deptId;
}
// 反序列化时有效(接收前端数据)
@JsonProperty
public void setDeptId(String deptId)
{
this.deptId = deptId;
}
问题的核心在于 @JsonIgnore
和 @JsonProperty
这两个注解在同一个字段上发生了冲突。
- •
@JsonIgnore
的作用 :这个注解告诉 Jackson 库(Spring Boot 默认的 JSON 处理器)在序列化 (对象转为 JSON)和反序列化 (JSON 转为对象)时都完全忽略这个字段
。这意味着,即使前端传了deptId
,Jackson 也不会将其值设置到对象的deptId
属性上 - • 注解冲突 :当
@JsonIgnore
存在时,它基本上会覆盖其他映射注解的效果。因此,尽管您也使用了@JsonProperty
,但@JsonIgnore
的"完全忽略"指令优先级更高,导致deptId
在反序列化过程中被跳过。