6

我有一个简单的Foo类,有两个属性和form活页夹:

import play.data.Form;

public class Foo {
    public static Form<Foo> form = Form.form(Foo.class);

    public String name;
    public List<Bar> bars = new ArrayList<Bar>();
}

类在哪里Bar

public class Bar {
    public String prop1;
    public String prop2;
}

当我尝试发出 POST ajax 请求时:

jsRoutes.controllers.Test.duh().ajax({
  data: {
    name: "Test",
    bars: [{prop1: "first"}]
  }
});

在duh方法中,在线:

Form<Foo> request = Foo.form.bindFromRequest();

我得到错误:

[InvalidPropertyException:bean 类 [models.Foo] 的无效属性“bars[0][prop1]”:索引属性路径“bars[0][prop1]”中引用的属性既不是数组,也不是 List,也不是 Map;返回值为 [first]]

AJAX 请求的表单数据如下所示:

name:Test
bars[0][prop1]:first

问题:在游戏框架中绑定复杂元素列表的正确方法是什么?这段代码还需要什么才能工作?

4

2 回答 2

0

根据此URL (POJO 对象绑定部分)中的指示 playframework web实体列表的绑定应为bar[0].prop1

于 2013-09-12T11:14:11.927 回答
0

正如@fjtorres 提到的,问题在于jQuery.param 序列化数据的方式。播放期望bars[0].prop1而不是bars[0][prop1]. 为了解决这个问题,我将代码更改为以下内容:

前端:

jsRoutes.controllers.Test.duh().ajax({
  data: JSON.stringify({
    name: "Test",
    bars: [{prop1: "first"}]
  }),
  headers: {
    "Content-Type": "application/json"
  }
});

后端 - 控制器:duh 方法:

Form<Foo> request = Foo.form.bind(request().body().asJson());

这会将数据作为 JSON 发送到后端。在后端JsonNode从请求正文中检索并传递给表单bind方法。

于 2013-09-12T13:26:13.380 回答