値の検証時のエラーメッセージ

セルの値の検証時など例外がスローされ、 CsvExceptionConverter によりメッセージに変換します。 CsvExceptionConverter は、CsvAnnotationBeanReader/CsvAnnotationBeanWriter に設定します。

メッセージリソースは MessageResolver で管理されてます。

  • デフォルトでは、 ResourceBundleMessageResolver が設定されています。

    • ResourceBundleMessageResolver では、システムのプロパティファイル com/github/mygreen/supercsv/localization/SuperCsvMessages.properties が読み込まれます。

    • 独自のメッセージは、クラスパスのルート配置した SuperCsvMessages.properties が読み込まれます。

  • 実装を切り替えることで、他の形式のファイルからも取得することができます。

MessageResolverの実装

クラス名

説明

ResourceBundleMessageResolver

java.util.ResourceBundle を経由してメッセージを参照します。
デフォルトでは SuperCsvMessages.properties を読み込みます。

PropertiesMessageResolver

java.util.Properties を経由してメッセージを参照します。

SpringMessageResolver

org.springframework.context.MessageSource を経由してメッセージを参照します。

また、メッセージ中には {var} の形式で変数が可能です。 さらに、${exp} の形式で 式言語の Java Expression Language (JEXL) が利用可能です。

デフォルト設定では、式言語ので呼び出し可能な関数が登録されています。 com.github.mygreen.supercsv.expression.CustomFunction のメソッドが接頭語 f: を付けて呼び出し可能です。 また、独自の関数も登録可能です。

メッセージと式言語の設定
 1import com.github.mygreen.supercsv.io.CsvAnnotationBeanReader;
 2import com.github.mygreen.supercsv.localization.MessageInterpolator;
 3import com.github.mygreen.supercsv.localization.ResourceBundleMessageResolver;
 4import com.github.mygreen.supercsv.validation.CsvExceptionConverter;
 5import com.github.mygreen.supercsv.expression.ExpressionLanguageJEXLImpl;
 6
 7import java.nio.charset.Charset;
 8import java.nio.file.Files;
 9import java.io.File;
10import java.util.ResourceBundle;
11
12import org.supercsv.prefs.CsvPreference;
13
14public class Sample
15 {
16
17    public void customMessageAndExpression() {
18
19        // CsvExceptionConverterの作成
20        CsvExceptionConverter exceptionConverter = new CsvExceptionConverter();
21
22        // メッセージソースを既存の物に対して追加する
23        ResourceBundleMessageResolver messageResolver = new ResourceBundleMessageResolver();
24        messageResolver.addResourceBundle(ResourceBundle.getBundle("SampleMessages"));
25        exceptionConverter.setMessageResolver(messageResolver);
26
27        // 式言語に独自の関数を登録
28        // 参照可能な関数は、public static である必要があります。
29        ExpressionLanguageJEXLImpl el = new ExpressionLanguageJEXLImpl();
30        Map<String, Object> funcs = new HashMap<>();
31        funcs.put("my", SampleFunctions.class);
32        el.getJexlEngine().setFunctions(funcs);
33
34        // カスタマイズした式言語の登録
35        exceptionConverter.setMessageInterpolator(new MessageInterpolator(el));
36
37        // CsvExceptionConverterを設定する
38        CsvAnnotationBeanReader<UserCsv> csvReader = new CsvAnnotationBeanReader<>(
39                UserCsv.class,
40                Files.newBufferedReader(new File("user.csv").toPath(), Charset.forName("Windows-31j")),
41                CsvPreference.STANDARD_PREFERENCE);
42
43        csvReader.setExceptionConverter(exceptionConverter);
44
45        //... 以下省略
46    }
47
48}