システム開発で思うところ

Javaで主にシステム開発をしながら思うところをツラツラを綴る

BeanValidationのメッセージ遅延変換

過去記事の

vermeer.hatenablog.jp

vermeer.hatenablog.jp

vermeer.hatenablog.jp

と、ResourceBundleの扱いを追加した

vermeer.hatenablog.jp

を まとめ直してライブラリを作成しました。

過去記事との違い

ライブラリにするにあたって、過去の記事の実装との相違点は以下

  • 参照リソースを複数指定できるようにする

  • メッセージ変換都度 Resourceのパスを渡すようにせず、Factoryで指定する

  • LocaleとResourceのパスを渡すタイミングを分ける

  • FormのValidationは適時実装するものとしてライブラリからは一旦除外する。

メッセージ変換の使い方(参考)

ざっくり示すと以下のような感じ。

Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

Set<ConstraintViolation<TargetView>> results = validator.validate(view, FormValidation.class);


// メッセージ変換に使用するResourceBundleを指定します
MessageInterpolatorFactory interpolatorFactory
              = MessageInterpolatorFactory.of("Messages", "FormMessages", "FormLabels");

// 複数のリソースを指定したい場合
//        MessageInterpolatorFactory interpolatorFactory
//                                  = MessageInterpolatorFactory.of(
//                        new String[]{"Messages", "Messages2"},
//                        new String[]{"FormMessages", "FormMessages2"},
//                        new String[]{"FormLabels", "FormLabels2"});

// 変換インスタンスを生成します(ロケールは未指定)
MessageInterpolator interpolator = interpolatorFactory.create();

// 変換インスタンスを生成します(ロケールを指定)
// MessageInterpolator interpolator = interpolatorFactory.create(Locale.JAPAN);

for (ConstraintViolation<TargetView> result : results) {
    // 検証結果からメッセージを変換します.
    String convertedMessage = interpolator.toMessage(result);
    System.out.println(convertedMessage);
}

その他、実際のAnnotationとの組み合わせについては、テストコードを参照していただければと思います。

Code

Bitbucket

さいごに

これだけだと実際のところ不十分で、JSFなどWebシステムでメッセージを出力するという具体的な使用感を掴みながら改修をしていくことになると思います。