2013-02-05 28 views
2

我目前使用Play v1.2.3。我有一個端點,我想發送一個將被反序列化成Java對象的json對象。所以,我有一些看起來像這樣:將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" 
}); 

不幸的是,上面的設置,似乎該播放不想發送整個數據對象,而是試圖填充兩個參數(第一個和最後一個)。有沒有一種方法可以定義端點直接消耗整個身體,還是必須手動完成?

+0

您是否嘗試過通過以下迭代: request.params.allSimple()鍵設置()迭代器(。 ); –

回答

1

嘗試要投射整個輸入身體成模型類:

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(); 
} 

此外,上述代碼利用所得到的模型對象和序列化回出來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();} 
} 
1

Play的操作方法參數綁定機制不接受JSON。你需要手動綁定它。在您的例子中,代碼可能是這樣的:

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

注意,GSON設有遊戲框架分佈,所以你可以自由地使用它

+0

調用會員數據是否會提取內容? –

+0

我不確定你在說什麼。使用gist.github.com寫你的代碼,並在這裏輸入鏈接以幫助人們理解 –

0

你的設置播放期待PARAMS與名字「! name.first「和」name.last「,你發送的是」first「和」last「。與此AJAX交

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