記事内容はタイトル通りです。
起きた状況
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
対処
メソッド名を変更することで呼び出してもらうことができます。
ただ、この場合はBoolean
を指定する必要も無いと思います。
また、フィールドに対するゲッターと名前が被る問題も有ります。
@AssertTrue(message = "ほげほげ")
@NotNull(message = "ふがふが")
private Boolean getValid() {
/* 相関チェック */
}
自分にはこれ以外の解決方法を見つけられませんでした。
感想
アノテーションを作らずに同じフィールドに関する複数の相関チェックを動かせると思ったんですが、うまくいきませんでした。
値の取得とバリデーションとを両立しようと思うとかなり辛くなるので、特に諸々が複雑になる場合はバリデーション用オブジェクトと値取得用オブジェクトを分けた方が賢明ですね……。