A Day In The Life

とあるプログラマの備忘録

Long型フィールドのrequiredバリデータが作動しない。

public class HogeForm extends ActionForm {
 private Long amount = null;
 public Long getAmount() {return amount;}
 public void setAmount(Long amount) {this.amount = amount;}
}

のようなアクションフォームにStruts-Validatorでrequiredを指定しても作動してくれませんでした。



原因調査したところどうもBeanUtils.copyProperties()で勝手にnullを0に変換していたようです。

その他ラッパークラス系(Integer、Float..ect)も同じみたいです。
マジかよ。。。
対策としてはServletのinit()などでConvertUtils.register(new LongConverter(null), Long.class);を実行してやればいいみたい。
ということなのでとりあえずFilterクラスを作ってそこで処理させることにしました。
Filterクラスはこんな↓感じ

package com.hoge.application;

public class ConvertFilter implements filter {

 public void init(FilterConfig config) throws ServletException {}

 public void destroy() {}

 public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws IOException, ServletException {
  ConvertUtils.register(new IntegerConverter(null), Integer.class);
  ConvertUtils.register(new LongConverter(null), Long.class);
  ConvertUtils.register(new FloatConverter(null), Float.class);
  ConvertUtils.register(new DoubleConverter(null), Double.class);
  chain.doFilter(request, response);
 }

}

あとはweb.xmlのweb-appタグのところに

<filter>
 <filter-name>Convert</filter-name>
 <filter-class>com.hoge.application.ConvertFilter</filter-class>
</filter>
<filter-mapping>
 <filter-name>Convert</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>

を追加してやればOKです。
これでちゃんと画面の値がnullでわたってきてrequiredも作動してくれました。

最終的にFilterでやるかどうかは少し考察がいりそうですがしばらくこれで行こうかと思ってます。