Jackson @JsonIgnore是一个继承的Java 8默认方法

时间:2017-05-05 15:40:52

标签: json java-8 jackson 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

有没有办法让杰克逊知道我不想让序列化的默认方法,但保持该方法的行为?我提出的当前解决方法是覆盖默认方法,用@JsonIgnore注释它,并委托默认方法:

@Entity
public class JpaBook implements Book {

    // ...

    @Override
    @JsonIgnore
    public String getSentenceForTitle() {
        return Book.super.getSentenceForTitle();
    }

}

但对于具有许多默认方法的接口,此解决方案可能会非常冗长且容易出错。

1 个答案:

答案 0 :(得分:3)

为了忽略特定的方法/字段,必须以某种方式指定,并且注释是最简单的方法。我可以推荐以下比您尝试过的更简单的选项:

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

    @JsonIgnore
    default String getSentenceForTitle() {
        return "This book's title is " + getTitle();
    }
    
  2. 如果Book不在您的控制之下,或者您希望方便指定的字段列表,则可以保留Book,并注释JpaBook使用字段或要忽略的字段数组。 E.g:

    @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 {