覆盖子类中的@JsonIgnore

Nic*_*wyn 5 java inheritance jackson

我有以下抽象类:

public abstract class StandardTimeStamp {

  @Temporal(TemporalType.TIMESTAMP)
  @Column(nullable = false)
  @JsonIgnore
  private Date lastUpdated;

  @PreUpdate
  public void generatelastUpdated() {
    this.lastUpdated = new Date();
  }

  public Date getLastUpdated() {
    return lastUpdated;
  }

  public void setLastUpdated(Date lastUpdated) {
    this.lastUpdated = lastUpdated;
  }
}
Run Code Online (Sandbox Code Playgroud)

我有一个实体是一个子类,我需要将lastUpdate值发送到浏览器,所以我需要覆盖@JsonIgnore.我尝试过一些东西,下面的代码就是其中之一:

public class MyEntity extends StandardTimestamp implements Serializable {

  @Column(name = "LastUpdated")
  private Date lastUpdated;

  @JsonIgnore(false)
  @Override
  public Date getLastUpdated() {
    return lastUpdated;
  }
}
Run Code Online (Sandbox Code Playgroud)

这确实在JSON响应上添加了lastUpdated属性,但是当它在数据库中不为null时,其值为null.我在子类中有其他日期可以工作,但它们不会被超类中的@IgnoreJson隐藏.

有什么想法吗?

Sot*_*lis 10

您将引入lastUpdated以此声明命名的第二个字段

@Column(name = "LastUpdated")
private Date lastUpdated;
Run Code Online (Sandbox Code Playgroud)

在你的子类型中MyEntity.我不确定数据库映射器如何处理这个问题,但对我来说这似乎是多余的.

我可以看到两个选项.

一,摆脱这个新领域,让你的override getLastUpdated方法委托给它的超级实现.例如

@Override
@JsonIgnore(false)
@JsonProperty
public Date getLastUpdated() {
    return super.getLastUpdated();
}
Run Code Online (Sandbox Code Playgroud)

在序列化MyEntity对象时,Jackson将通过此访问器发现单个属性lastUpdated,并使用它来生成JSON.它最终将从超类中检索它.

二,使用类注释@JsonIgnoreProperties标记超类中被忽略的属性

@JsonIgnoreProperties("lastUpdated")
abstract class StandardTimeStamp {
Run Code Online (Sandbox Code Playgroud)

然后清除(或添加不同的值)子类中的"list"

@JsonIgnoreProperties()
class MyEntity extends StandardTimeStamp implements Serializable {
Run Code Online (Sandbox Code Playgroud)

Jackson只会在子类上使用注释(如果它存在),并忽略超类上的注释.