在AJAX POST上绑定play框架中的复杂元素列表

dug*_*tov 6 java playframework

我有一个Foo带有两个属性和formbinder 的简单类:

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>();
}
Run Code Online (Sandbox Code Playgroud)

哪个Bar班级是:

public class Bar {
    public String prop1;
    public String prop2;
}
Run Code Online (Sandbox Code Playgroud)

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

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

在duh方法中,在线:

Form<Foo> request = Foo.form.bindFromRequest();
Run Code Online (Sandbox Code Playgroud)

我收到错误:

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

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

name:Test
bars[0][prop1]:first
Run Code Online (Sandbox Code Playgroud)

问题:在play框架中绑定复杂元素列表的正确方法是什么?此代码还需要什么工作?

dug*_*tov 0

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

前端:

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

后端 - 控制器:duh 方法:

Form<Foo> request = Foo.form.bind(request().body().asJson());
Run Code Online (Sandbox Code Playgroud)

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