Передать объект json в действие play-framework
В настоящее время я использую 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 не хочет отправлять весь объект данных, а вместо этого пытается заполнить два параметра (первый и последний). Есть ли способ определить конечную точку для непосредственного потребления всего тела, или это нужно делать вручную?
3 ответа
Чтобы привести все входное тело в класс 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();}
}
Механизм привязки параметров метода действия Play не принимает JSON. Вы должны связать это вручную. В вашем примере код может быть что-то вроде:
public static void putName( String data ) {
FullName fname = new Gson().fromJSON(data, FullName.class);
...
}
Обратите внимание, что Gson поставляется с дистрибутивом Play! Framework, поэтому вы можете использовать его бесплатно.
С вашими настройками игра ожидает параметры с именами "name.first" и "name.last", а вы отправляете "first" и "last". Попробуйте с этим сообщением ajax
$.ajax({
type: "PUT",
data: {
name: {
first: "Michael",
last: "Bailey"
}
},
url: "/user/name"
});