@JsonCreator 告诉Jackson 使用这个构造函数来实例化一个对象。在此示例中,updateCount 不是构造函数参数之一,因此即使 POST 或 PUT 请求 JSON 正文包含名为 updateCount 的属性,JSON 正文中的此 JSON 属性 updateCount 也会被忽略。正如您在构造函数中看到的那样,Foo.updateCount 是由代码初始化的。
带有@JsonProperty 的getter getUpdateCount 使字段updateCount 可序列化,包含在GET 请求的响应正文中。
带有@JsonIgnore 的setter setUpdateCount 使字段updateCount 不可反序列化,在PATCH 更新请求中将被忽略。
建议你去掉setter setUpdateCount,使用方法incrementUpdateCount递增。
public class Foo{
@Id
private String id;
private String name;
private int updateCount;
@JsonCreator
public Foo(@JsonProperty("name") String name) {
this.name = name;
this.updateCount = 0;
}
// getter and setter of name is omitted for briefness
@JsonProperty
public int getUpdateCount() {
return updateCount;
}
@JsonIgnore
public void setUpdateCount(int updateCount) {
this.updateCount = updateCount;
}
public void incrementUpdateCount(int change) {
this.updateCount += change;
}
public void incrementUpdateCount() {
this.updateCount += 1;
}
}
通过添加到您的 application.properties 来禁用 Jackson 映射器功能 INFER_PROPERTY_MUTATORS
spring.jackson.mapper.infer-property-mutators = false
或application.yml,如果您使用 YAML 格式
spring:
jackson:
mapper:
infer-property-mutators: false
如果启用了 Jackson 映射器功能 INFER_PROPERTY_MUTATORS,则 getter 表示字段可反序列化。
我有一个test case 来显示启用和禁用此功能之间的区别。