2017-09-04 13 views
1

我有通常只输出JSON的Spring REST API。忽略CSV和JSON中的不同字段

现在我还想为某些端点导出CSV。

杰克逊已经为

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

库,我可以使用Spring的HttpMessageConverter利用。

但是我需要排除CSV中存在于JSON中的一些字段,因此我不能使用@JsonIgnore注释。有没有办法为CSV使用不同的忽略属性/注释?

作为一种替代方案,我考虑使用自定义界面来提取值,以便事先序列化值。 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

我有一些杰克逊CSV映射器的问题,但你的解决方案工作(至少在使用JSON时)。 –