覆盖子类

时间:2016-05-06 14:15:52

标签: 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;
  }
}

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

public class MyEntity extends StandardTimestamp implements Serializable {

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

  @JsonIgnore(false)
  @Override
  public Date getLastUpdated() {
    return lastUpdated;
  }
}

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

有什么想法吗?

1 个答案:

答案 0 :(得分:9)

您正在使用此声明

引入名为lastUpdated的第二个字段
@Column(name = "LastUpdated")
private Date lastUpdated;
您的子类型MyEntity中的

。我不确定数据库映射器如何处理这个问题,但对我来说这似乎是多余的。

我可以看到两个选项。

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

@Override
@JsonIgnore(false)
@JsonProperty
public Date getLastUpdated() {
    return super.getLastUpdated();
}

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

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

@JsonIgnoreProperties("lastUpdated")
abstract class StandardTimeStamp {

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

@JsonIgnoreProperties()
class MyEntity extends StandardTimeStamp implements Serializable {

Jackson只会在子类上使用注释,如果它存在,则忽略超类上的注释。