Jackson @JsonIgnore 继承了Java 8个默认方法
Jackson @JsonIgnore an inherited Java 8 default method
我有一个带有默认方法的接口:
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;
}
}
使用这个实体,我注意到 Jackson 也会序列化默认方法 getSentenceForTitle()
- 尽管在我的特定情况下,我不希望 sentenceForTitle
被序列化。
有没有办法让 Jackson 知道我不想序列化默认方法,但仍保持该方法的行为?我想出的当前解决方法是覆盖默认方法,用 @JsonIgnore
注释它,并委托给默认方法:
@Entity
public class JpaBook implements Book {
// ...
@Override
@JsonIgnore
public String getSentenceForTitle() {
return Book.super.getSentenceForTitle();
}
}
但是对于具有许多默认方法的接口,此解决方案可能会变得非常冗长且容易出错。
为了让特定的 methods/fields 被忽略,这必须以某种方式指定,注释是最简单的方法。我可以推荐以下比您尝试过的更简单的选项:
在 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
)并忽略所有 getter。您无需在 Book
处执行任何操作,例如:
@JsonAutoDetect(fieldVisibility = ANY, getterVisibility = NONE)
class JpaBook implements Book {
我有一个带有默认方法的接口:
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;
}
}
使用这个实体,我注意到 Jackson 也会序列化默认方法 getSentenceForTitle()
- 尽管在我的特定情况下,我不希望 sentenceForTitle
被序列化。
有没有办法让 Jackson 知道我不想序列化默认方法,但仍保持该方法的行为?我想出的当前解决方法是覆盖默认方法,用 @JsonIgnore
注释它,并委托给默认方法:
@Entity
public class JpaBook implements Book {
// ...
@Override
@JsonIgnore
public String getSentenceForTitle() {
return Book.super.getSentenceForTitle();
}
}
但是对于具有许多默认方法的接口,此解决方案可能会变得非常冗长且容易出错。
为了让特定的 methods/fields 被忽略,这必须以某种方式指定,注释是最简单的方法。我可以推荐以下比您尝试过的更简单的选项:
在
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
)并忽略所有 getter。您无需在Book
处执行任何操作,例如:@JsonAutoDetect(fieldVisibility = ANY, getterVisibility = NONE) class JpaBook implements Book {