有没有办法正确绑定到表单上的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的无状态且无持久性的表示层
答案 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)
首先,由于User
和Group
似乎是实体,因此您应该扩展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的更新破坏一些绑定行为时发出警告(它发生在我身上)。