我目前使用的是 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 似乎不想发送整个数据对象,而是尝试填充两个参数(第一个和最后一个)。有没有办法定义端点来直接使用完整的主体,还是必须手动完成?
最佳答案
将整个输入主体转换为模型类:
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();}
}
关于java - 将 json 对象传递给 play-framework 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14717210/