Воспроизведение фреймворка FORM с привязкой к Set вместо List - PullRequest
5 голосов
/ 05 октября 2011

Есть ли способ правильно связать набор с формой?

Я выполняю привязку POJO, и мой контроллер получает объект User

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 элементов с кучей пустых элементов (по одному пустому для каждого флажка, который не был отмечен), и я могу просто создать новый список без нулевых но это кажется неправильным.

Редактировать: Пользователь и группа не должны быть постоянными объектами, Play просто действует как уровень представления без сохранения состояния и без постоянного отображения для успокоительного API

Ответы [ 3 ]

3 голосов
/ 05 марта 2012

Новая реализация Binder в Play 1.2.4 позволяет это сделать.

В версиях Play ранее 1.2.4 (выпущено 2 декабря 2011 г.) вы не могли связать набор, отправляя параметры типа

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"

Проблема с привязкой к списку заключается в том, что вы получите список длиной 5, где значения в 0 и 2 равны нулю.

Если вам все еще нужно использовать версию Play минор 1,2.4, обходной путь для этой проблемы мог бы использовать

Map<String, Group> groups

вместо Set или List.Тогда между ними не будет нулевых элементов, и вы получите коллекцию, вызвав groups.values ​​().

0 голосов
/ 07 декабря 2011

У меня похожая проблема с Play. Привязка игры - авто-магия, но иногда вам нужно обойтись.

Вы можете просто создать сеттер

public void setGroups(List<Group> groups)

И внутренне установите предоставленные группы в ваш набор. Это немного грязно, но будет работать.

Я также рекомендую вам создать тестовый блок для имитации привязки. Создайте карту для имитации запроса POST и привяжите карту к вашему объекту к Binder. Это гораздо проще, чем повторять процесс из веб-интерфейса, и он формирует регрессионный тест и предупреждает вас, если обновление Play нарушает некоторые из обязательных действий (это происходит со мной).

0 голосов
/ 05 октября 2011

Во-первых, поскольку User и Group кажутся сущностями, вы должны расширить класс play.db.jpa.Model и также определить его как @Entity.Например:

@Entity
public class User extends Model {

    ...

}

Благодаря расширению Model вам не нужно определять технический идентификатор (т. Е. Вы можете удалить public Long id), и для этого у вас будет общий DAOкласс (см. Javadoc )

Теперь вы должны определить группы User следующим образом:

@ManyToMany
public Set<Group> groups;
...