2017-09-04 3 views
1

J'ai une API Spring REST qui ne génère généralement que du JSON.Ignorer différents champs dans CSV et JSON

Maintenant, je veux également exporter des fichiers CSV pour certains terminaux.

Jackson a une bibliothèque qui

<dependency> 
    <groupId>com.fasterxml.jackson.dataformat</groupId> 
    <artifactId>jackson-dataformat-csv</artifactId> 
    <version>2.8.5</version> 
</dependency> 

que je peux utiliser l'aide HttpMessageConverter de printemps.

Cependant, j'ai besoin d'exclure certains champs dans le CSV qui sont présents dans le JSON, donc je ne peux pas utiliser l'annotation @JsonIgnore. Existe-t-il un moyen d'utiliser une propriété/annotation ignore pour CSV? Comme alternative, j'ai envisagé d'utiliser une interface personnalisée pour extraire les valeurs afin de sérialiser les valeurs avant la main. List<CSVableDTO> ->List<Map<String,?>> -> CSV. Mais je voudrais éviter cela car cela implique une création d'instance supplémentaire et un codage supplémentaire par rapport à l'utilisation d'une nouvelle annotation.

Java-classe Exemple:

public class MyDTO { 

    @CSVIgnore 
    public int id; 
    public String name; 
    public String property; 
    @CSVIgnore 
    public String ref; 

} 

JSON-Exemple:

[ 
    { 
     "id": 42, 
     "name": "Example", 
     "property": "FooBar", 
     "ref": "42:Not:FooBar:1337" 
    } 
] 

attendu-CSV Résultat:

"name";"property" 
"Example";"FooBar" 

Répondre

1

S'il vous plaît, pensez à l'utilisation de JsonView mechanism. Vous aurez quelque chose comme ça:

public class Foo { 

    public interface JsonOnly{} 
    public interface CsvView{} 

    @JsonView(JsonOnly.class) 
    private Integer secretNotForCsv; 

    // ... 

} 

@RestController 
public class FooController { 

     @RequestMapping(...) 
     @JsonView(Foo.JsonOnly.class) 
     public Foo getJson() { 
      // ... 
     } 

     @RequestMapping(...) 
     @JsonView(Foo.CsvView.class) 
     public Foo getCsv() { 
      // ... 
     } 
} 

Ceci est seulement une esquisse très rude, mais il devrait vous donner une idée.

+0

Cela ressemble à une solution prometteuse. Bien que je ne veuille pas créer une nouvelle méthode dans tous mes contrôleurs pour leur permettre de servir des CSV. (peut-être https://stackoverflow.com/questions/22875642/jackson-set-default-view) peut me sauver pour éviter les méthodes en double.) Je vais le tester et ensuite rendre compte. –

+1

J'ai quelques problèmes avec le mappeur Jackson CSV mais votre solution fonctionne (au moins en utilisant JSON). –