2017-05-05 9 views
1

を@JsonIgnoreこれを使用してジャクソンは、私は、デフォルトのメソッドとのインタフェースを持って継承したJava 8のデフォルトの方法

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

} 

しかし、この解決策は、多くのデフォルトのメソッドとのインタフェースのための非常に冗長とエラーが発生しやすい得ることができます。

答えて

2

特定のメソッド/フィールドを無視するには、何らかの方法でアノテーションを指定する必要があります。アノテーションは最も単純な方法です。

  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に注釈を付けることができます。あなたが例えばBookで何もする必要はありません。:

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

恐ろしい、私は、* JPAエンティティクラスのレベルに '(..)JsonIgnoreProperties @オプション*'と一緒に行きました。このシリアライゼーションの側面をシリアライゼーション中心クラスに結びつけるので、私はそれが最もクリーンな解決策であることがわかります。 – Abdull

関連する問題