2017-05-05 1 views
1

j'ai une interface avec une méthode par défaut:Jackson @JsonIgnore une méthode par défaut Java 8 hérité

public interface Book { 

    String getTitle(); 

    default String getSentenceForTitle() { 
     return "This book's title is " + getTitle(); 
    } 

} 

... et j'ai une Assemblée parlementaire paritaire @Entity implémentant cette interface:

@Entity 
public class JpaBook implements Book { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    private String title; 

    // ... 

    @Override 
    public String getTitle() { 
     return title; 
    } 

} 

En utilisant cette entité, j'ai remarqué que Jackson va également sérialiser la méthode par défaut getSentenceForTitle() - bien que dans mon cas particulier, je ne veux pas que sentenceForTitle soit sérialisé.

Existe-t-il un moyen de faire savoir à Jackson que je ne veux pas que les méthodes par défaut soient sérialisées, tout en conservant le comportement de cette méthode? La solution actuelle, je suis venu avec est redéfinissant la méthode par défaut, annoter avec @JsonIgnore, et de déléguer à la méthode par défaut:

@Entity 
public class JpaBook implements Book { 

    // ... 

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

} 

Mais cette solution peut être assez bavard et sujette aux erreurs pour les interfaces avec de nombreuses méthodes par défaut.

Répondre

2

Pour que les méthodes/champs spécifiques soient ignorés, cela doit être spécifié d'une manière ou d'une autre et l'annotation est le moyen le plus simple de le faire. Je peux recommander les options suivantes qui sont plus simples que ce que vous avez essayé:

  1. Annoter la méthode par défaut sans elle en remplaçant JpaBook. Ainsi, dans Book:

    @JsonIgnore 
    default String getSentenceForTitle() { 
        return "This book's title is " + getTitle(); 
    } 
    
  2. Si Book n'est pas sous votre contrôle ou s'il y a une liste des champs que vous souhaitez spécifier commodément, vous pouvez laisser Book tel qu'il est et annoter JpaBook avec un champ ou un tableau des champs à ignorer. Par exemple:

    @JsonIgnoreProperties("sentenceForTitle") 
    class JpaBook implements Book { 
    

    Ou

    @JsonIgnoreProperties({"sentenceForTitle", "alsoIgnoreThisField"}) 
    class JpaBook implements Book { 
    
  3. Vous pouvez aussi annoter JpaBook sérialiser tous les champs (de JpaBook) et ignorer tous les apporteurs. Vous n'avez pas besoin de faire quoi que ce soit Book .: par exemple

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

Impressionnant, je suis allé avec l'option * '@ JsonIgnoreProperties (..)' sur le niveau de la classe d'entités JPA *. Je trouve que c'est la solution la plus propre, car elle maintient cet aspect de sérialisation cohérent avec la classe centrée sur la sérialisation. – Abdull