Edited at

【BeanValidation】「is~」で始まるメソッドでjava.lang.Booleanを返す場合AssertTrue / AssertFalseでバリデーションできない【Java】

記事内容はタイトル通りです。


起きた状況

AssertTrueを用いた相関チェックで、「falseならエラー1、nullならエラー2」というようなバリデーションを行おうとしたところ、バリデーション時にメソッドが呼び出されなくなりました。

@AssertTrue(message = "ほげほげ")

@NotNull(message = "ふがふが")
private Boolean isValid() {
/* 相関チェック */
}


原因

公式ドキュメントより、以下の通りです。

平たく言うと、java.lang.Booleanはオブジェクトなので、is~から始まるメソッド名を付けるのは規約違反だからです。

考えてみれば当たり前の話なんですが、ややこしいので勘弁して欲しいです……。


What is a getter?

The JavaBeans specification specifies that a getter is a method whose


  • name starts with get and has a return type but no parameter

  • name starts with is, has no parameter and is returning boolean

出展: Bean Validation specification



対処

メソッド名を変更することで呼び出してもらうことができます。

ただ、この場合はBooleanを指定する必要も無いと思います。

また、フィールドに対するゲッターと名前が被る問題も有ります。

@AssertTrue(message = "ほげほげ")

@NotNull(message = "ふがふが")
private Boolean getValid() {
/* 相関チェック */
}

自分にはこれ以外の解決方法を見つけられませんでした。


感想

アノテーションを作らずに同じフィールドに関する複数の相関チェックを動かせると思ったんですが、うまくいきませんでした。

値の取得とバリデーションとを両立しようと思うとかなり辛くなるので、特に諸々が複雑になる場合はバリデーション用オブジェクトと値取得用オブジェクトを分けた方が賢明ですね……。