背景
- SpringでCSV出力機能を作ろうとしている
- ベースはこの記事を真似すればすぐにできた
課題
- CSVの特定のカラムだけにクオートをつけたい
- 少し調べただけだとString型のカラム全てクオートをつけるかつけないかしかできなかった
対応策
- String型は全てクオートをつける設定にする
- クオートをつけたくないカラムに
@JsonRawValue
をつける
サンプル
SampleController.java
@RestController
public class SampleController {
@GetMapping(value="/sample.csv", produces="text/csv;charset=utf-8;Content-Disposition:attachment")
public String csv() throws JsonProcessingException {
List<UserBean> rows = new ArrayList<UserBean>() {
{
add(new UserBean("ozaki", "runners", 27));
}
};
CsvMapper mapper = new CsvMapper();
// withHeaderをつけると一行目にヘッダーがつく
CsvSchema schema = mapper.schemaFor(UserBean.class).withHeader();
// ALWAYS_QUOTE_STRINGSとするとString型のカラムはクオートをつけるよってことになる
mapper.configure(CsvGenerator.Feature.ALWAYS_QUOTE_STRINGS, true);
return mapper.writer(schema).writeValueAsString(rows);
}
}
UserBean.java
// CSVのカラムの順番をセット
@JsonPropertyOrder({"name", "team", "age"})
public class UserBean {
private String name;
// JsonRawValueがあるとクオートがつかない
@JsonRawValue
private String team;
private Integer age;
public UserBean(String name, String team, Integer age) {
this.name = name;
this.team = team;
this.age = age;
}
/* setter/getter */
sample.csv
"name","team","age"
"ozaki",runners,27