2011-10-04 11 views
5

¿Hay alguna manera de vincular correctamente a un conjunto en un formulario?Marco de juego FORMATO vinculante para Establecer en lugar de Lista

que estoy haciendo vinculante POJO y mi controlador de toma en un objeto Usuario

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; 

    } 

Parece que no puedo para hacer que mi campo se vincule a los grupos

he intentado user.groups []. Id, user.groups [0] .id, user.groups.id. Puedo hacer que funcione con una lista muy bien, pero cuando se publica obtengo una lista de N elementos con un conjunto de elementos nulos (un nulo para cada casilla que no estaba marcada) y pude crear una lista nueva sin los nulos. pero eso parece estar mal.

Editar: de usuario y de grupo no están destinados a ser entidades persistentes, Juego está actuando simplemente como menos persistente capas sin estado y presentación de una API reparador

Respuesta

3

La nueva implementación de Binder de Play 1.2.4 lo permite.

En las versiones del juego anterior a 1.2.4 (publicado 02 de diciembre de del 2011) no se podía obligar a un conjunto de parámetros de envío como

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" 

El problema con la unión a una lista es que obtendrá una lista de longitud 5 donde el valor en 0 y 2 es nulo.

Si todavía necesita utilizar Juego de versión menor que 1.2.4, una solución para este problema podría estar utilizando

Map<String, Group> groups 

en lugar de Set o Lista. Entonces no obtendrá elementos nulos en el medio y obtendrá Colección llamando a groups.values ​​().

+0

Gracias una vez que puedo verificar esto, aceptaré :) – dstarh

+0

Los valores en los corchetes son índices de lista y deben ser consecutivos desde cero y, si no son Play, se agregan en valores nulos. – tazmaniax

0

En primer lugar, ya que User y Group parece ser Entidad , debe extender la clase play.db.jpa.Model y también definirla como @Entity. Por ejemplo:

@Entity 
public class User extends Model { 

    ... 

} 

Gracias a la extensión de Model, no es necesario definir el ID técnica (es decir, se puede quitar la public Long id), y que tendrá una DAO genérico para esta clase (ver el Javadoc)

Ahora, hay que definir los grupos de User así:

@ManyToMany 
public Set<Group> groups; 
+0

Ok algunas cosas, el usuario y el grupo no son entidades, play es simplemente actuar como una capa de presentación sin estado y persistente para una API relajante. El verdadero problema aquí y quizás no destaqué lo suficiente es por qué un FORMULARIO no puede vincularse a un SET pero puede hacerlo a una LISTA – dstarh

0

tengo problema similar con Play. La vinculación de Play es auto-mágica, pero a veces necesitas tener soluciones alternativas.

simplemente Puede crear un regulador

public void setGroups(List<Group> groups) 

Y internamente establecer los grupos proporcionados a su conjunto. Está un poco sucio pero funcionará.

También te recomiendo que crees un estuche de prueba para simular el encuadernado. Cree un Mapa para simular la solicitud POST y vincule el mapa a su objeto con el Cuaderno. Es mucho más fácil que repetir el proceso desde la interfaz web, y forma una prueba de regresión y alertarte si la actualización de Play rompe algunos de los comportamientos vinculantes (me pasa a mí).

+0

sí, esto funcionaría pero aún no cambia el hecho de que debe nombrar sus campos obj .collection [index] .prop – dstarh

Cuestiones relacionadas