我可以在 Java Jackson 的反序列化过程中忽略基于 getter 的只写 属性 吗?

Can I ignore a getter-based write-only property during deserialization in Java Jackson?

我有一个遗产 JSON API class,我正在进化以删除某个 属性。目前,属性 值始终是相同的常量,因此我希望我的 Java 代码只是一个简单的 getter,没有基础字段。我想继续序列化该值,直到我知道我的所有客户都已停止使用该值。该对象仅由我的客户读取,因此我不必担心他们会发送其他值。

public class MyType {
  private String value;

  public boolean isLegacyValue() {
    return true;
  }
}

就是说,如果我使用现在常量 属性 反序列化完整值,我不希望任何测试代码或类似代码失败。有没有一种方法可以让 Jackson 序列化 setter 方法 - 仅 属性,但在反序列化时忽略它?我尝试了几种不同的方法,但在反序列化时得到了 UnrecognizedPropertyException。我宁愿不为这个 属性.

更改全局 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
{"value": "ABC", "legacyValue": true}

也可以接受的方法是告诉 Jackson 包含值而不包含 Java 字段。

我知道我可以在我的 setter 之外添加一个 getter,或者将其设为一个字段,但这两个选项感觉它们混淆了 Java API,因为它实际上并不匹配常量约束:

public void setLegacyValue(boolean legacyValue) {
    // No-op; only exists for Jackson deserialization
}

我发现通过反复试验可以解决的一件事是将其作为最终字段。无论出于何种原因,Jackson 都知道将其作为只写常量处理,这种方式在不匹配 setter 的情况下不适用于 getter。如果仅使用 getter.

无法做到这一点,这将是我的解决方案
private final boolean legacyValue = true;

public boolean isLegacyValue() {
    return legacyValue;
}

Jackson 使用 @JsonPropertyaccess 参数支持 "one-way" 属性。像这样注释你的 属性:

@JsonProperty(access = READ_ONLY)
public boolean isLegacyValue() {
    return true;
}