我具有带有默认方法的接口:
public interface Book {
String getTitle();
default String getSentenceForTitle() {
return "This book's title is " + getTitle();
}
}
...而且我有一个JPA @Entity
实现此接口:
@Entity
public class JpaBook implements Book {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String title;
// ...
@Override
public String getTitle() {
return title;
}
}
使用此实体,我注意到杰克逊还将序列化默认方法getSentenceForTitle()
-尽管在我的特殊情况下,我不希望sentenceForTitle
序列化。
有没有一种方法让杰克逊知道我不想将默认方法序列化,却保持该方法的行为?我想出的当前解决方法是覆盖默认方法,用@JsonIgnore
注释,并委派给默认方法:
@Entity
public class JpaBook implements Book {
// ...
@Override
@JsonIgnore
public String getSentenceForTitle() {
return Book.super.getSentenceForTitle();
}
}
但是,对于使用许多默认方法的接口,此解决方案可以得到相当详细的和错误的。
为了使特定的方法/字段忽略,必须以某种方式指定这一点,而注释是最简单的方法。我可以推荐以下比您尝试过的更简单的选项:
-
注释默认方法,而无需在
JpaBook
中覆盖它。因此,在Book
中:@JsonIgnore default String getSentenceForTitle() { return "This book's title is " + getTitle(); }
-
如果
Book
不在您的控制之下,或者如果您要方便地指定字段列表,则可以将Book
视为原样,并带有一个字段或一系列字段或一系列字段以忽略的JpaBook
。例如:@JsonIgnoreProperties("sentenceForTitle") class JpaBook implements Book {
或
@JsonIgnoreProperties({"sentenceForTitle", "alsoIgnoreThisField"}) class JpaBook implements Book {
-
您还可以注释
JpaBook
以序列化(JpaBook
的所有字段(并忽略所有Getters。您无需在Book
上做任何事情,例如:@JsonAutoDetect(fieldVisibility = ANY, getterVisibility = NONE) class JpaBook implements Book {