2

我目前正在使用 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"
});

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

4

3 回答 3

1

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

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

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

于 2013-02-05T21:43:10.137 回答
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();
}

此外,上面的代码采用生成的模型对象并将其序列化回 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 回答
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 回答