我目前正在使用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"
});
不幸的是,通过上面的设置,似乎播放不想发送整个数据对象,而是尝试填充两个参数(第一个和最后一个)。有没有办法定义端点直接使用完整的主体,还是必须手工完成?
答案 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"
});