iberck
9/7/2016 - 6:35 PM

Grails Command objects

Grails Command objects

Command objects

Es un objeto que sirve para mapear los parámetros del request hacia un objeto y que se pasa como argumento a una acción. Un command object sirve para hacer un wrapper orientado a objetos del request y ejecutar validaciones con el fin de enviar algo más limpio al controlador.

Al command object se delega la responsabilidad de validar los datos del request y armar objetos a partir del mismo. Y se delega al controlador la responsabilidad de decidir hacia qué lugar ir.

Command objects y enums

Grails no soporta una enumeración como argumento de accion, para que haga databinding se necesita que el enum esté dentro de un command object.

@Validateable

Permite la definición de constraints tal como se hace en los domain class. Si el command está definido en la misma clase que el controlador, Grails automáticamente lo marca como @Validateable.

Domain class vs Command objects

La única diferencia entre un domain class y un command object es que el command object no es persistente.

Los constraints de un command object se utilizan para validar la vista mientras que los constraints de los domain clases se utilizan además de validar la vista, para validar que se guarde correctamente el objeto sobre la base de datos.

Los command objects tienen ventaja sobre los domain objects en el databinding ya que permiten cambios en caliente mientras que el domain class hay que reiniciar en cada cambio.

Evitar databinding de propiedades

Se evita con bindable: false o declarando la propiedad transient.

class SubmitDetailsCommand {
  String previousAddress
  
  static constraints = {
      previousAddress nullable: true, bindable: false
  }
}