2010年1月2日土曜日

JSON化するときのpublicフィールド(のみ!?)対応(T2)

スズキです。

T2でOVal使うときに、pubicフィールド対応を場当たりでやったのですが、
http://blog.suz-lab.com/2009/12/ovalformresolverpublict2.html
その副作用として、JSON化時に返していたリクエストパラメータが
入らなくなってしまいました…
http://code.google.com/p/suz-lab-gae/issues/detail?id=2

ということで、今回も、かなり適当にな対応です…
っていうか、今度はpublicフィールドのみJSONになる感じです...
が、これで困ったら、また修正ってことで…

--------【ApiResponse.java】--------
public ApiResponse<P, R> createResponse(P params, ErrorInfo info) {
  this.errors = new ArrayList<String>();
  if(!info.hasError()) {
    this.params = new HashMap<String, Object>();
      for(Field field : params.getClass().getFields()) {
        try {
          this.params.put(field.getName(), field.get(params));
        } catch(IllegalAccessException e) {
          this.errors.add(e.getMessage());
        }
      }
    if(this.errors.size() == 0) {
      this.results = this.createResults();
    }
  } else {
    for(Throwable error : info.getErrors()) {
      this.errors.add(error.getMessage());
    }
  }
  return this;
}
--------
http://code.google.com/p/suz-lab-gae/source/browse/trunk/suz-lab-gae/src/suz/lab/gae/t2/ApiResponse.java?r=95

で、こんな感じで使ってます。
(引数にfinalつけると、無名クラスのオーバーライドするメソッド中で使うことができます)

--------【ApiResponse.java】--------
@Ajax
@POST
@ActionPath
public Navigation insert(
  @Form(resolverClass=OvalFormResolver.class) final IndexJson.InsertForm form,
  ErrorInfo info
) {
  return (new ApiResponse<IndexJson.InsertForm, Map<String, Object>>() {
    @Override
    protected Map<String, Object> createResults() {
      Entity entity = new Entity("feed");
      entity.setProperty("url", new Link(form.url));
      DatastoreService datastore
        = DatastoreServiceFactory.getDatastoreService();
      datastore.put(entity);
      return GaeUtil.convertToMap(entity);
    }
  }).createResponse(form, info).toJsonNavigation();
}
--------
http://code.google.com/p/suz-lab-gae/source/browse/trunk/suz-lab-feed/src/suz/lab/feed/page/other/mypage/IndexJson.java?r=95

publicフィールド対応は、どっかで時間とって、しっかり実装したいなー。

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

0 コメント: