独自のクラスタイプへの対応

独自の変換処理を実装するには、2つのステップを踏む必要があります。

  1. TextFormatter の実装クラスの作成

  2. アノテーション @CsvFormat で作成したTextFormatterの指定

以下、それぞれに対して解説していきます。

TextFormatterの実装クラスの作成

サンプルとして、 java.net.URL にマッピングするTextFromatterを作成します。

  • 抽象クラス AbstractTextFormatter [ JavaDoc ] を継承します。

  • メソッド parse(...) で、読み込み時の文字列からオブジェクト型に変換するメソッドの実装を行います。

    • 変換に失敗した場合、例外 TextParseException をスローします。 既存の例外が発生する場合は、ラップするようにします。

  • メソッド print(...) で、書き込みにオブジェクト型から文字列に変換するメソッドの実装を行います。

    • 変換に失敗した場合、例外 TextPrintException をスローします。 既存の例外が発生する場合は、ラップするようにします。

  • メソッド getMessageVariables(...) で、エラーメッセージ中の変数を定義することができます。

    • 必要がなければ実装する必要はありません。

 1import java.net.MalformedURLException;
 2import java.net.URL;
 3import java.util.HashMap;
 4import java.util.Map;
 5
 6import com.github.mygreen.supercsv.cellprocessor.format.AbstractTextFormatter;
 7import com.github.mygreen.supercsv.cellprocessor.format.TextParseException;
 8
 9// URLにマッピングするクラス
10public class UrlFormatter extends AbstractTextFormatter<URL> {
11
12    // 読み込み時の文字列からオブジェクト型に変換するメソッドの実装
13    @Override
14    public URL parse(final String text) {
15
16        try {
17            return new URL(text);
18        } catch(MalformedURLException e) {
19            throw new TextParseException(text, URL.class, e);
20        }
21
22    }
23
24    // 書き込みにオブジェクト型から文字列に変換するメソッドの実装
25    @Override
26    public String print(final URL object) {
27        return object.toExternalForm();
28    }
29
30    // 読み込み時のエラーメッセージ中で使用可能な変数の定義
31    // 必要があればオーバライドして実装します。
32    @Override
33    public Map<String, Object> getMessageVariables() {
34
35        final Map<String, Object> vars = new HashMap<>();
36
37        vars.put("key", "vars");
38
39        return vars;
40    }
41
42}

作成したTextFormatterの指定

作成したTextFormatterを指定するには、アノテーション @CsvFormat [ JavaDoc ]を使用します。

  • 属性 formatter で、TextFormatterの実装クラスを指定します。

  • 属性 message で、読み込み時のエラーメッセージを指定することができます。

 1import java.net.URL;
 2
 3import com.github.mygreen.supercsv.annotation.CsvBean;
 4import com.github.mygreen.supercsv.annotation.CsvColumn;
 5import com.github.mygreen.supercsv.annotation.format.CsvFormat;
 6
 7@CsvBean
 8public class SampleCsv {
 9
10    @CsvColumn(number=1, label="ホームページ")
11    @CsvFormat(formatter=UrlFormatter.class,
12            message="[{rowNumber}行, {columnNumber}列] : 項目「{label}」の値({validatedValue})は、URLの形式として不正です。"
13    private URL homepage;
14
15    // setter/getterは省略
16
17}