11. ライフサイクルイベントの管理

レコード単位に、読み込み/書き込みの前後のイベントをハンドリングすることができます。

実装方法として、JavaBeanに直接処理を実装する方法と、リスナークラスを指定して別のクラスで実装する方法の2種類があります。

11.1. ライフサイクル・コールバック用のアノテーション

ライフサイクルイベントに対応するアノテーションをメソッドに付与することで、 そのメソッドをコールバック呼び出しすることができます。

表 - 11.1.1 ライフサイクルイベント用のアノテーション

アノテーション

概要

参照

@CsvPreRead

レコードの読み込み前に実行されます。

JavaDoc

@CsvPostRead

レコードの読み込み後に実行されます。

JavaDoc

@CsvPreWrite

レコードの書き込み前に実行されます。

JavaDoc

@CsvPostWrite

レコードの書き込み後に実行されます。

JavaDoc

注釈

不明な引数を定義している場合は、nullが渡されます。

メソッドには以下の引数を取ることができます。

  • 引数は、とらなくても可能です。

  • 引数の順番は任意で指定可能です。

表 - 11.1.2 コールバック用のメソッドに指定可能な引数一覧

引数のタイプ

説明

org.supercsv.util.CsvContext [ JavaDoc ]

CSVの1レコード分の情報。

com.github.mygreen.supercsv.validation.CsvBindingErrors [JavaDoc ]

CSVの1レコード分のエラー情報。

com.github.mygreen.supercsv.validation.ValidationContext [JavaDoc ]

値の検証用の情報。

Class[]

グループのクラス情報。

処理対象の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}