2017-09-04 3 views
1

通常はJSONを出力I sの持っている春のREST APIの異なるフィールドを無視します。はCSVとJSON

今、私はまた、いくつかのエンドポイント用のCSVをエクスポートします。

ジャクソンは、私は春のHttpMessageConverterを使用して利用できるよう

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

ためのライブラリを持っています。

は、しかし、私はこのように私は@JsonIgnoreアノテーションを使用することはできませんJSONに存在しているCSVの一部のフィールドを除外する必要があります。 CSVに違うignoreプロパティ/注釈を使用する方法はありますか?私は手前の値をシリアル化する値を抽出するカスタムインターフェイスを使用して考え代替として

List<CSVableDTO> - >List<Map<String,?>> - > CSV。しかし、追加のインスタンスの作成と余分なコーディングと新しいアノテーションを使用するだけなので、これを避けたいと思います。

のJavaクラス例:

public class MyDTO { 

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

} 

JSON-例:

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

期待-CSV-結果:

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

答えて

1

JsonView mechanismの利用をご検討ください。

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() { 
      // ... 
     } 
} 

これは非常に概略的なスケッチですが、それはあなたに考えを与える必要があります。

+0

これは有望な解決策のように見えます。私はすべてのコントローラに新しいメソッドを作成してCSVを提供できるようにしたくありません。 (多分https://stackoverflow.com/questions/22875642/jackson-set-default-view)重複したメソッドを避けるために私をベルプすることができます。)私はそれをテストしてから戻って報告します。 –

+1

私はJackson CSVマッパーにいくつかの問題がありますが、あなたのソリューションは(少なくともJSONを使用しているときは)機能します。 –