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

読み込みと書き込み処理の前、後それぞれのライフサイクルのイベントにおいて、任意の処理を呼び出すことができます。

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

publicメソッドに付与 する必要があります。

表 - 7.1 ライフサイクル・コールバック用のアノテーション一覧

アノテーション

説明

@XlsPreLoad

シートの値の読み込み直前に実行されます。

@XlsPostLoad

シートの値の読み込み後に実行されます。
シート内の全ての値の読み込み後に実行されます。

@XlsPreSave

オブジェクトの書き込み直前に実行されます。

@XlsPostSave

オブジェクトの書き込み後に実行されます。
シート内の全ての値の書き込み後に実行されます。

また、特定の引数をとることができます。

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

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

表 - 7.2 コールバック用アノテーションのメソッドに指定可能な引数一覧

指定可能な引数のタイプ

説明

org.apache.poi.ss.usermodel.Sheet

処理対象のSheetオブジェクト。

com.gh.mygreen.xlsmapper.Configuration

com.gh.mygreen.xlsmapper.validation.SheetBindingErrors

シートのエラー情報 を格納するオブジェクト。
読み込み時に引数で渡したオブジェクト。

処理対象のBeanクラス

処理対象のBeanオブジェクト。 [ver1.3+]

java.lang.Object

処理対象のBeanオブジェクト。 [ver1.3+]

以下のような時にライフサイクルコールバック関数を利用します。

  • 読み込み前、書き込み前のフィールドの初期化。

  • 読み込み後の入力値の検証。

  • 書き込み後の本ライブラリで提供されない機能の補完。

    • 例えば、Excelファイル上の定義された名前の範囲の変更や入力規則の設定。

7.1. JavaBeanクラスに実装する場合

シート用クラス、レコード用クラスのどちらにも定義できます。

実行順は、親であるシートクラスの処理が先に処理されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// シートクラス
@XlsSheet(name="Users")
public class SampleSheet {

    @XlsHorizontalRecords(tableLabel="ユーザ一覧")
    private List<UserRecord> records;

    @XlsPreLoad
    @XlsPreSave
    public void onInit() {
        // 読み込み前と書き込み前に実行される処理
    }
}

// レコードクラス
public class UserRecord {

    @XlsColumn(columnName="ID")
    private int id;

    @XlsColumn(columnName="名前")
    private String name;

    @XlsPostLoad
    public void onPostLoad(Sheet sheet, Configuration config, SheetBindingErrors errors) {
        // 読み込み後に実行される処理
        // 入力値チェックなどを行う
    }

}

7.2. リスナークラスに実装する場合

クラスにアノテーション @XlsListener を付与し、属性 value で処理が実装されたクラスを指定します。 [ver1.0+]

指定したリスナークラスのインスタンスは、システム設定「beanFactory」経由で作成されるため、SpringFrameworkのコンテナからインスタンスを取得 することもできます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// シートクラス
@XlsSheet(name="Users")
@XlsListener(SampleSheetListener.class)
public class SampleSheet {

    @XlsHorizontalRecords(tableLabel="ユーザ一覧")
    private List<UserRecord> records;

}

// SampleSheetクラスのリスナー
public static class SampleSheetListener {

    @XlsPreLoad
    @XlsPreSave
    public void onInit(SampleSheet targetObj) {
        // 読み込み前と書き込み前に実行される処理
    }
}

// レコードクラス
@XlsListener(UserRecordListener.class)
public class UserRecord {

    @XlsColumn(columnName="ID")
    private int id;

    @XlsColumn(columnName="名前")
    private String name;

}

// UserRecordクラスのリスナー
public static class UserRecordListener {

    @XlsPostLoad
    public void onPostLoad(UserRecord targetObj, Sheet sheet, Configuration config, SheetBindingErrors errors) {
        // 読み込み後に実行される処理
        // 入力値チェックなどを行う
    }
}