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 被忽略,这必须以某种方式指定,注释是最简单的方法。我可以推荐以下比您尝试过的更简单的选项:

  1. JpaBook 中注释默认方法而不覆盖它。所以在 Book:

    @JsonIgnore
    default String getSentenceForTitle() {
        return "This book's title is " + getTitle();
    }
    
  2. 如果Book不在你的控制之下,或者如果有一个字段列表你想方便地指定,你可以让Book保持原样并注释JpaBook 带有要忽略的字段或字段数组。例如:

    @JsonIgnoreProperties("sentenceForTitle")
    class JpaBook implements Book {
    

    或者

    @JsonIgnoreProperties({"sentenceForTitle", "alsoIgnoreThisField"})
    class JpaBook implements Book {
    
  3. 您还可以注释 JpaBook 以序列化所有字段(JpaBook)并忽略所有 getter。您无需在 Book 处执行任何操作,例如:

    @JsonAutoDetect(fieldVisibility = ANY, getterVisibility = NONE)
    class JpaBook implements Book {