2009年12月31日木曜日

OvalFormResolverをpublicフィールドに対応(T2)

スズキです。

こちらで、T2のpublicフィールドに関してつぶやいていたら、
http://blog.suz-lab.com/2009/12/ovalpaget2.html
shot6さんからTwitterで下記コメントをいただきました。
> 今のところpublicフィールドはサポートしてないんです。
> 問題が多いので多分この先もサポートしないと思います。ごめんなさーい。

と言うことで、じゃあ、OvalFormResolverのときだけでも、と思い、
下記のように実装してみました。

--------【Java】--------
...
@Override
public void resolve(Form form, WebContext context, Object object,
ErrorInfo info) {
  super.resolve(form, context, object, info);
  this.setPublicFields(context.getRequest(), object, info);
  this.validateForm(object, info);
}

private void setPublicFields(Request request, Object object, ErrorInfo info) {
  for(Field field : object.getClass().getFields()) {
    Object value = request.getParameter(field.getName());
    if(value != null) {
      try {
        field.set(object, value);
      } catch(IllegalAccessException e) {
        info.addErrorInfo(e.getMessage(), e);
      }
    }
  }
}

private void validateForm(Object object, ErrorInfo info) {
  Validator validator = new Validator();
  List<ConstraintViolation> violations = validator.validate(object);
  for(ConstraintViolation violation : violations) {
    info.addErrorInfo(violation.getMessage(), new
ConstraintsViolatedException(violation));
  }
}
...
--------
http://code.google.com/p/suz-lab-gae/source/browse/trunk/suz-lab-gae/src/suz/lab/gae/t2/OvalFormResolver.java?r=89

見ての通り、かなり適当です…(全然テストもしていません…)
必要に応じて、精度を上げてくって感じですね…

ようやく、マジック1だ!今年最後のネタは何にしようかなー?

--------
http://www.suz-lab.com

0 コメント: