Vaidationと継承
Validationを継承した場合の動きが少し変だったので調査してみました。
@Required private String hoge;
これはサブクラスから見えないから?と思ってpublicにしてみたりしたけど必須チェックかからず。
@Required public void setHoge(String hoge) { this.hoge = hoge; }
ちゃんと継承されて必須チェックがかかります。△な理由は後述。
- サブクラスでオーバーライドしたsetterにアノテーション→○
@Override @Required public void setHoge(String hoge) { super.setHoge(hoge); }
Doltengで作ったCRUDアプリがこのスタイルなので、Validationは継承させずに各サブクラスでというのが標準?
さて、Validationの継承が△な理由ですが、それはHot Deployできないという点です。
厳密に言えば常にHot Deployできない訳でなくて、スーパークラスしか変更されていない場合にHot deployでその変更が反映できないということのようです。
例えばスーパークラスのあるsetterに@Requiredを付けてその動きを確認しようとしても必須チェックは動作しません。その後サブクラスにも何かしらの変更を加えると必須チェックが動作するようになります。あるいはアプリケーションサーバーを再起動してもOKです。
スーパークラスのメソッドを変更すればサブクラスに変更がなくても当然Hot Deployで変更を反映できるので、なぜアノテーションの場合だけこういう動きになるのでしょう?どちらの場合もスーパークラスだけ変更した場合にはサブクラスのclassファイルは更新されないようですし、ちょっと理由がわかりません・・・。
(追記)
どうやらアノテーションだからという理由ではなさそうです。
Teeda HTML ExampleのForeachArrayを使って似たような現象を再現できました。
FooDtoのbbbをcccに変更し、AbstractForeachPageとhtmlもcccへ変更した場合Hot Deployではこの変更に対応できずcccの値は表示されません。ForeachArrayPageにも何かしらの変更を加えて再コンパイルするかアプリケーションサーバーを再起動するとcccの値も表示できるようになります。