将json对象传递给play-framework动作

时间:2013-02-05 21:24:35

标签: java ajax json playframework playframework-1.x

我目前正在使用Play v1.2.3。我有一个端点,我想发送一个json对象,它将被反序列化为Java对象。所以,我有一些看起来像这样的东西:

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

不幸的是,通过上面的设置,似乎播放不想发送整个数据对象,而是尝试填充两个参数(第一个和最后一个)。有没有办法定义端点直接使用完整的主体,还是必须手工完成?

3 个答案:

答案 0 :(得分:1)

Play的动作方法参数绑定机制不接受JSON。您需要手动绑定它。在您的示例中,代码可能类似于:

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

注意,Gson提供了play!框架分发,因此您可以自由使用它

答案 1 :(得分: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();}
}

答案 2 :(得分:0)

使用您的设置播放期望名称为“name.first”和“name.last”的参数,并且您正在发送“first”和“last”。试试这个ajax帖子

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