11. ライフサイクルイベントの管理
レコード単位に、読み込み/書き込みの前後のイベントをハンドリングすることができます。
実装方法として、JavaBeanに直接処理を実装する方法と、リスナークラスを指定して別のクラスで実装する方法の2種類があります。
11.1. ライフサイクル・コールバック用のアノテーション
ライフサイクルイベントに対応するアノテーションをメソッドに付与することで、 そのメソッドをコールバック呼び出しすることができます。
アノテーション |
概要 |
参照 |
---|---|---|
|
レコードの読み込み前に実行されます。 |
|
|
レコードの読み込み後に実行されます。 |
|
|
レコードの書き込み前に実行されます。 |
|
|
レコードの書き込み後に実行されます。 |
注釈
不明な引数を定義している場合は、nullが渡されます。
メソッドには以下の引数を取ることができます。
引数は、とらなくても可能です。
引数の順番は任意で指定可能です。
引数のタイプ |
説明 |
---|---|
|
CSVの1レコード分の情報。 |
|
CSVの1レコード分のエラー情報。 |
|
値の検証用の情報。 |
|
グループのクラス情報。 |
処理対象のBeanクラス |
処理対象のBeanオブジェクト。 |
以下のような時にライフサイクル・コールバック関数を利用します。
書き込み前のフィールドの初期化。
読み込み後の入力値の検証。
1import com.github.mygreen.supercsv.annotation.CsvBean;
2import com.github.mygreen.supercsv.annotation.CsvColumn;
3import com.github.mygreen.supercsv.annotation.CsvPostRead;
4import com.github.mygreen.supercsv.annotation.CsvPostWrite;
5import com.github.mygreen.supercsv.annotation.CsvPreRead;
6import com.github.mygreen.supercsv.annotation.CsvPreWrite;
7
8@CsvBean(header=true)
9public class SampleCsv {
10
11 @CsvColumn(number=1, label="ID")
12 private Integer id;
13
14 @CsvColumn(number=2, label="値")
15 private String value;
16
17 @CsvPreRead
18 public void handlePreRead() {
19
20 // レコードの読み込み前に呼び出されます。
21 }
22
23 @CsvPostRead
24 public void handlePostRead(final CsvBindingErrors bindingErrors, final Class<?>[] groups) {
25
26 // レコードの読み込み後に呼び出されます。
27
28 }
29
30 @CsvPreWrite
31 public void handlePreWrite(final CsvBindingErrors bindingErrors, final Class<?>[] groups) {
32
33 // レコードの書き込み前に呼び出されます。
34
35 }
36
37 @CsvPostWrite
38 public void handlePostWrite(final CsvBindingErrors bindingErrors, final Class<?>[] groups) {
39
40 // レコードの書き込み後に呼び出されます。
41
42 }
43
44 // setter/getterは省略
45}
11.2. リスナークラスによるライフサイクルの管理
リスナークラスはPOJOで作成し、ライスサイクル用のアノテーションでメソッドを実装します。
処理対象のレコードオブジェクトが必要なため、基本的に引数にはレコードクラスを指定しておきます。
1import com.github.mygreen.supercsv.annotation.CsvPostRead;
2import com.github.mygreen.supercsv.annotation.CsvPostWrite;
3import com.github.mygreen.supercsv.annotation.CsvPreRead;
4import com.github.mygreen.supercsv.annotation.CsvPreWrite;
5
6// リスナークラスの定義
7public class SampleListener {
8
9 @CsvPreRead
10 public void handlePreRead(final SampleCsv record) {
11
12 // レコードの読み込み前に呼び出されます。
13 }
14
15 @CsvPostRead
16 public void handlePostRead(final SampleCsv record, final CsvBindingErrors bindingErrors, final Class<?>[] groups) {
17
18 // レコードの読み込み後に呼び出されます。
19
20 }
21
22 @CsvPreWrite
23 public void handlePreWrite(final SampleCsv record, final CsvBindingErrors bindingErrors, final Class<?>[] groups) {
24
25 // レコードの書き込み前に呼び出されます。
26
27 }
28
29 @CsvPostWrite
30 public void handlePostWrite(final SampleCsv record, final CsvBindingErrors bindingErrors, final Class<?>[] groups) {
31
32 // レコードの書き込み後に呼び出されます。
33
34 }
35
36}
使用する際には、@CsvBean(listeners=<リスナークラス>)
にクラスを指定します。
1import com.github.mygreen.supercsv.annotation.CsvBean;
2import com.github.mygreen.supercsv.annotation.CsvColumn;
3
4// リスナクラスを指定します
5@CsvBean(header=true, listeners=SampleListener.class)
6public class SampleCsv {
7
8 @CsvColumn(number=1, label="ID")
9 private Integer id;
10
11 @CsvColumn(number=2, label="値")
12 private String value;
13
14}