BeanValidatorFormの微妙さは異常

BeanValidatorFormって知ってますか。知ってる人は知ってると思いますけど、StrutsのActionFormのサブクラスの一つです。名前からも想像がつく通り、ValidatorFormのサブクラスです。ただのActionFormと何が違うかというと、

 

と書いて、HogeFormがActionFormを継承していなかった場合に、HogeFormをラップしてさもActionFormを継承しているかのように振る舞ってくれるのがBeanValidatorFormです。つまり、POJOでActionFormを作れてしまう訳です。POJOなので(即ち、特定のWebフレームワークに依存していない)、他のBeanに詰め替えたりせずにビジネスロジックに直接引き渡してしまっても特に問題も無かったりするわけです。しかも、ValidatorFormのサブクラスなので、Struts Validatorも問題なく使える訳です。


なんて素敵なんでしょう。


そう考えていた時期が私にもありました(AA略)


といってもそんな大昔じゃなくほんの一週間くらい前までそう考えてましたけど


一見便利そうなこのBeanValidatorForm。実は、使ってみて分かったんですけど、シリアライズできないんですよね。BeanValidatorForm自体はimplements Serializableしてるので、一見シリアライズできそうに見えるんですが、BeanValidatorFormが内部的に保持しているWrapDynaBeanがシリアライズできないので、結局BeanValidatorFormも完全にはシリアライズできません。というか、実際にHogeFormをラップしているWrapDynaBeanがシリアライズできないので、事実上全くシリアライズできない(と、いうかシリアライズしても意味が無い)といっても過言では無いでしょう。即ち、セッションのレプリケーションするような要件があったりとかすると、アウトな感じです。Tomcatってさりげなく起動停止時にセッションをシリアライズ/デシリアライズしてご丁寧にセッションを復元してくれてるっぽいので、しょっちゅう「WrapDynaBeanがシリアライズできません」なんて怒られます。ActionServletとかを色々弄れば真にシリアライズ可能な「SerializableBeanValidatorForm」なんてものを自作することも可能ですが(実際、自作してみました)、正直めんどくさいです。そんな死ぬ程めんどくさいってことも無いですけど、そんなとこに労力かけるくらいなら普通に素直にActionForm継承する方がましな感じです。


implements Serializableしてるからにはシリアライズ可能な意図で設計してると思うんだけど、なんでこんな中途半端なことになってるんだろう?