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@XlsSheet(name="Users")
 3public class SampleSheet {
 4
 5    @XlsHorizontalRecords(tableLabel="ユーザ一覧")
 6    private List<UserRecord> records;
 7
 8    @XlsPreLoad
 9    @XlsPreSave
10    public void onInit() {
11        // 読み込み前と書き込み前に実行される処理
12    }
13}
14
15// レコードクラス
16public class UserRecord {
17
18    @XlsColumn(columnName="ID")
19    private int id;
20
21    @XlsColumn(columnName="名前")
22    private String name;
23
24    @XlsPostLoad
25    public void onPostLoad(Sheet sheet, Configuration config, SheetBindingErrors errors) {
26        // 読み込み後に実行される処理
27        // 入力値チェックなどを行う
28    }
29
30}

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

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

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

 1// シートクラス
 2@XlsSheet(name="Users")
 3@XlsListener(SampleSheetListener.class)
 4public class SampleSheet {
 5
 6    @XlsHorizontalRecords(tableLabel="ユーザ一覧")
 7    private List<UserRecord> records;
 8
 9}
10
11// SampleSheetクラスのリスナー
12public static class SampleSheetListener {
13
14    @XlsPreLoad
15    @XlsPreSave
16    public void onInit(SampleSheet targetObj) {
17        // 読み込み前と書き込み前に実行される処理
18    }
19}
20
21// レコードクラス
22@XlsListener(UserRecordListener.class)
23public class UserRecord {
24
25    @XlsColumn(columnName="ID")
26    private int id;
27
28    @XlsColumn(columnName="名前")
29    private String name;
30
31}
32
33// UserRecordクラスのリスナー
34public static class UserRecordListener {
35
36    @XlsPostLoad
37    public void onPostLoad(UserRecord targetObj, Sheet sheet, Configuration config, SheetBindingErrors errors) {
38        // 読み込み後に実行される処理
39        // 入力値チェックなどを行う
40    }
41}