Передать объект 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"
});
Другие вопросы по тегам