Lauro Becker

Java, Grails and other great things

Grails: Command Objects

Command Objects são objetos com funcionalidades parecidas às das classes de domínio, mas não servem para persistência de dados. Eles possuem capacidade de databinding e validação, comportamentos eventualmente requeridos para objetos que não representam nossas entidades. Quem já trabalhou com Struts 1 pode fazer uma analogia aos Forms.

Esta semana estive desenvolvendo um cadastro que necessitava de uma boa gama de validações. Essas validações variavam de acordo com a ação. Por exemplo, ao inserir era necessário executar as validações A, B e C. Já ao alterar, B, C e D deveriam ser processadas.

Para ilustrar o problema, vou utilizar um exemplo simplificado de manutenção de usuários. Imagine que temos a classe de domínio User:

class User {
	String username
	String password

	static constraints = {
		username blank: false, unique: true
		password blank: false, minSize : 6
	}
}

Ao criar um usuário, simplesmente nos preocupamos em garantir que username e password estejam populados e, neste caso, o password tenha no mínimo 6 dígitos. Obviamente o username deve ser único.

Depois de cadastrado, queremos permitir que o usuário altere sua senha. Para garantir um pouco de segurança, vamos solicitar que ele informe a senha atual, a nova senha e confirme a nova senha. O que inicialmente vem em mente é criar atributos transients na nossa classe User e relacionar as validações necessárias dentro de constraints. Eu não consigo visualizar como fazer isso de forma simples, sem uma série de testes confusos. A forma mais clara que encontrei foi utilizando Command Objects.

Crie uma classe chamada UserCommand, adicione as propriedades e defina as constraints, assim como você faria com uma classe de domínio. Pode ser em um arquivo separado, mas normalmente eles são declarados dentro do mesmo arquivo que o Controller. P.ex.:

class UserController {
	def update = { UserCommand cmd ->
		if (cmd.hasErrors()) {
			// ...
		}
	}
}

class UserCommand {
	String username;
	String actualPassword;
	String newPassword;
	String confirmNewPassword;

	static constraints = {
		// TODO As validações necessárias
	}
}

Submeta o formulário para a action update e observe:

  1. Os dados serão populados, e as conversões necessárias serão efetuadas;
  2. Automaticamente o método validate() será chamado.

Pronto! Não há muito mais o que explicar. Como normalmente acontece, com Grails temos códigos simples e eficientes.

Referência: http://grails.org/doc/1.0.x/guide/single.html#6.1.9 Command Objects

Referência: http://grails.org/doc/latest/guide/6.%20The%20Web%20Layer.html#6.1.10%20Command%20Objects

Advertisements

3 responses to “Grails: Command Objects

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: