2

私は現在 Play v1.2.3 を使用しています。Java オブジェクトに逆シリアル化される json オブジェクトを送信するエンドポイントがあります。だから、私は次のようなものを持っています:

public class UserController extends Controller {

  public static class FullName {
    public String first;
    public String last;
  }

  public static void putName( FullName name ) { ... }
}

##### routes
PUT /user/name    UserController.putName

それが整ったら、指定された JavaScript でエンドポイントを呼び出したいと思います。

$.ajax({
  type: "PUT",
  data: { first: "Michael", last: "Bailey" },
  url: "/user/name"
});

残念ながら、上記のセットアップでは、play はデータ オブジェクト全体を送信することを望んでおらず、代わりに 2 つのパラメーター (最初と最後) を設定しようとしているようです。完全なボディを直接消費するようにエンドポイントを定義する方法はありますか、それとも手動で行う必要がありますか?

4

3 に答える 3

1

入力本文全体を Model クラスにキャストするには:

public static void create(JsonObject body) {
    CaseFolder caseFolder = new Gson().fromJson(body, CaseFolder.class);
    caseFolder.user = getConnectedUser();

    if(caseFolder.validateAndSave()) {
        renderJSON(
                new JSONSerializer()
                    .exclude("*.class")
                    .exclude("user")
                    .serialize(caseFolder));
    } else 
        error();
}

また、上記のコードは、結果の Model オブジェクトを取得し、それをシリアル化して JSON に応答本文として戻します。

JSON リクエスト内の特定のフィールドにアクセスするだけの場合は、次を使用できます。

public static void update(JsonObject body) {
    try {
        Long id = (long) body.get("id").getAsInt();
        CaseFolder cf  = CaseFolder.loadAndVerifyOwner(getConnectedUser(), id);
        cf.number = body.get("number").getAsString();
        cf.description = body.get("description").getAsString();
        if(cf.validateAndSave())
            ok();
        else
            error();
    }
    catch (NullIdException      e) {error();} 
    catch (NotFoundException    e) {notFound();} 
    catch (NotOwnerException    e) {forbidden();}
    catch (Exception            e) {e.printStackTrace(); error();}
}
于 2013-02-13T05:37:59.030 に答える
1

Play のアクション メソッドのパラメーター バインディング メカニズムは、JSON を受け入れません。手動でバインドする必要があります。あなたの例では、コードは次のようになります。

public static void putName( String data ) { 
   FullName fname = new Gson().fromJSON(data, FullName.class);
   ...
}

Gson は play!framework ディストリビューションで提供されているため、自由に使用できます。

于 2013-02-05T21:43:10.137 に答える
0

あなたの設定では、play は「name.first」と「name.last」という名前のパラメーターを期待しており、「first」と「last」を送信しています。このajax投稿で試してください

$.ajax({
  type: "PUT",
  data: { 
    name: {
      first: "Michael",
      last: "Bailey" 
    }
  },
  url: "/user/name"
});
于 2013-02-06T07:40:43.327 に答える