我有以下抽象类:
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隐藏。
有什么想法吗?
答案 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只会在子类上使用注释,如果它存在,则忽略超类上的注释。