【问题标题】:Jackson @JsonIgnore an inherited Java 8 default methodJackson @JsonIgnore 继承的 Java 8 默认方法
【发布时间】:2023-04-04 18:19:02
【问题描述】:

我有一个带有默认方法的接口:

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

}

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

【问题讨论】:

    标签: json java-8 jackson default-method


    【解决方案1】:

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

    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 {
      

    【讨论】:

    • 太棒了,我在 JPA 实体类级别选择了 @JsonIgnoreProperties(..)。我发现它是最干净的解决方案,因为它使这个序列化方面与以序列化为中心的类保持一致。
    猜你喜欢
    • 1970-01-01
    • 2022-12-20
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    相关资源
    最近更新 更多