播放框架FORM绑定到Set而不是List

时间:2011-10-04 20:56:09

标签: java data-binding playframework

有没有办法正确绑定到表单上的Set?

我正在进行POJO绑定,我的控制器接受用户对象

public static void create(User user)

user.java

public class User implements Serializable {



    public Long id;

    @Required
    @Email
    public String email;

    public Set<Group> groups;

}

Group.java

    public class Group implements Serializable {

        public Long id;

        public String name;

    }

我似乎无法将我的字段绑定到组

我试过了user.groups []。id,user.groups [0] .id,user.groups.id。我可以使用它来处理列表就好了但是当它发布时,我得到一个N元素的列表,其中包含一堆空项(对于每个未检查的复选框,一个为null)我可以创建一个没有空值的新列表但那似乎不对。

编辑:用户和群组并不是持久性实体,Play只是充当无状态API的无状态且无持久性的表示层

3 个答案:

答案 0 :(得分:3)

Play 1.2.4的新Binder实现允许这样做。

在1.2.4之前的Play版本(2011年12月2日发布)中,您无法通过发送

等参数来绑定集合
user.groups[1].id = 1
user.groups[1].name = "name1"
user.groups[3].id = 3
user.groups[3].name = "name3"
user.groups[4].id = 4
user.groups[4].name = "name4"

绑定到List的问题是你将获得一个长度为5的List,其中0和2的值为null。

如果您仍然需要使用小于1.2.4的播放版本,则此问题的解决方法可能是使用

Map<String, Group> groups

而不是Set或List。然后你不会在它们之间获得null元素,你将通过调用groups.values()获得Collection。

答案 1 :(得分:0)

首先,由于UserGroup似乎是实体,因此您应该扩展play.db.jpa.Model类,并将其定义为@Entity。例如:

@Entity
public class User extends Model {

    ...

}

由于Model的扩展,您无需定义技术ID(即您可以删除public Long id),并且您将拥有此类的通用DAO(请参阅{ {3}})

现在,你必须像这样定义User的组:

@ManyToMany
public Set<Group> groups;

答案 2 :(得分:0)

我和Play有类似的问题。 Play的绑定是自动魔术,但有时你需要解决方法。

您只需创建一个setter

即可
public void setGroups(List<Group> groups)

并在内部将提供的组设置为您的组。它有点脏,但会起作用。

我还建议您创建一个单元测试用例来模拟绑定。创建一个Map来模拟POST请求,并将地图绑定到您对象的Binder。它比从网络界面重复这个过程要容易得多,并且它会形成一个回归测试,并在Play的更新破坏一些绑定行为时发出警告(它发生在我身上)。