2017-05-05 140 views
1

我有一個默認的方法的接口:傑克遜@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(); 
    } 

} 

但是這種解決方案可以得到相當繁瑣,容易出錯的接口有許多默認的方法。

回答

2

爲了讓特定的方法/字段被忽略,必須以某種方式指定它,而註解是最簡單的方法。我可以推薦比你試過這麼簡單以下選項:

  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)各個領域和忽略所有干將。你不需要在Book E.g做任何事情:

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

真棒,我選擇去*'@ JsonIgnoreProperties(..)'在JPA實體類水平*。我發現它是最乾淨的解決方案,因爲它使序列化方面與以序列化爲中心的類保持一致。 – Abdull