Jackson @jsonignore一种继承的Java 8默认方法



我具有带有默认方法的接口:

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();
    }
}

但是,对于使用许多默认方法的接口,此解决方案可以得到相当详细的和错误的。

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

  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的所有字段(并忽略所有Getters。您无需在Book上做任何事情,例如:

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

最新更新