iberck
3/13/2017 - 5:56 PM

Grails estrategias para databinding

Grails estrategias para databinding

Databinding domain class dentro de un command

Utilice esta estrategia para no repetir todas las propiedades del domain class dentro del command object, en los controladores reciba el command y el domain para evitar plagar las vistas de command.domain.property.

Databinding a través de un domain class

Utilice esta alternativa cuando los parámetros de la página coincidan con los del domain class y no se necesite una lógica de validación más allá de la que se ofrece dentro del domain class.

Databinding a través de 1 command object

Utilice esta alternativa cuando tenga una página tenga 1 solo panel y dicho panel tenga validaciones avanzadas.

Databinding a través de N command objects

Utilice esta alternativa cuando tenga N paneles dentro de una página y que cada uno tenga sus propias validaciones.

Utilice la alternativa 6 para resolver este problema.

Databinding a través de un domain class

Utilice directamente un domain class en el databinding cuando tenga una vista que no requiere validaciones especiales más allá de las definidas el domain class en static constraints.

Cuando utilice un domain class para databinding tenga en cuenta que si no obtiene la instancia del doman class a través de read(), serán persistidos automáticamente todos los valores temporales asignados al domain class aunque no se invoque explicitamente el método save().

Si el domain class tiene errores de validación, ninguna de sus propiedades serán persistidas automáticamente. Por ejemplo intentar asignar -1 a una edad donde el valor mínimo es 0 provocará errores de validación y ningún valor del domain class será persistido automáticamente.

Otro detalle a tomar en cuenta es que los valores temporales no serán persistidos a menos que haya una transacción de por medio, ya sea a nivel de controlador o que el domain class sea pasado a un método transaccional. El domain class deberá entrar a una transacción para poder ser persistido. Puede anotar el controlador con @Transactional o pasar el domain class a un servicio para persitirlo.

Si obtiene el domain class con read, tendrá que ejecutar explicitamente el método save() para guardarlo. Si lo obtiene con get o a través de un argumento de la acción del controlador (get), los cambios serán persistidos automáticamente cuando termine la transacción y si no hay errores de validación.

En conclusión, si utiliza esta estrategia cuide no asignar valores temporales al domain class y recuerde que cuando haya errores de validación, no será persistido ningún valor del domain class.