Criando um Converter para um tipo específico em Grails

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (0)  (0)

Neste artigo mostro como criar um converter para um tipo de dado específico através do mecanismo binding do spring que converte os parâmetros html para objeto e vice-versa.

1. Introdução

Já aconteceu alguma vez de você precisar converter automaticamente um tipo de dado específico da camada de visualização para uma determinada propriedade na camada de modelo e pra isso você sempre precisar converter essa informação do objeto para a página e vice-versa?

Então, você não precisa se preocupar com isso se a sua aplicação possuir um editor de propriedade (PropertyEditor) específico para esse tipo de dado.

É isso que pretendo compartilhar com vocês nesse artigo, espero que esse tipo de problema não aconteça mais com você desde então.

2. Como o Grails realiza o “binding”de dados.

Quando sua aplicação submete um formulário, o controlador da ação executa o método dataBind para converter os valores dos parâmetros para as propriedades específicas do modelo. Nesse momento o Grails instancia a classe GrailsDataBind para fazer essa mágica, e ela por sua vez, instancia algumas classes PropertyEditor responsável pela conversão dos tipos de dados padrão do groovy como Integer, Double, etc. O que precisamos fazer é simplesmente implementar um PropertyEditor específico para o nosso tipo de dado e em seguida, registrá-lo no GrailsDataBind para que o Grails reconheça-o quando o método dataBind for invocado no controlador.

3. Construindo um PropertyEditor para Data.

Nosso exemplo será de um Converter para o tipo Data. Veja a seguir um diagrama de classe de como deverá ser implementado nosso conversor.


Primeiramente vamos criar a classe DatePropertyEditor responsável pela conversão de objeto para string através do método getAsText() e da conversão de string para object através do método setAsText(String text).

public class DatePropertyEditor extends PropertyEditorSupport {

    private SimpleDateFormat df;

    public CustomDateBinder() {
        df = new SimpleDateFormat("dd/MM/yyyy");
    }

    public void setAsText(String text) throws IllegalArgumentException {
        if (text != null && !text.equals("")) {
            try {
                super.setValue(df.parse(text));
            }
            catch (ParseException ex) {
                throw new IllegalArgumentException("Data inválida");
            }
        }
        else {
            super.setValue(null);
        }
    }

    public String getAsText() {
        if (super.getValue() != null) {
            return df.format(super.getValue());
        }
        else {
            return null;
        }
    }

}

Agora precisamos implementar a interface PropertyEditorRegistrar, que será responsável pelo registro do nosso conversor DatePropertyEditor. Veja a seguir a codificação.

package binders;

public class MyPropertyEditorRegistrar implements PropertyEditorRegistrar {

    public MyPropertyEditorRegistrar() {
    }

    public void registerCustomEditors(PropertyEditorRegistry reg) {
        reg.registerCustomEditor(Date.class, new DatePropertyEditor());
    }

}

E finalmente, configuramos nossa classe MyPropertyEditorRegistrar no arquivo resources.groovy que fica localizado no diretório “grails-app/config/spring”.

beans = {
    myPropertyEditorRegistrar(binders.MyPropertyEditorRegistrar)
}

4. Conclusão.

Os converters são itens importantíssimos em uma aplicação web, e já que Grails veio para simplificar a vida do desenvolvedor, porque não utilizá-los em nossos projetos, uma vez que depois de implementados não precisamos mais converter as informações transferidas entre a camada de visualização e a camada de modelo ou vice-versa, tudo isso fica transparente para o desenvolvedor que ganhará minutos preciosos para se dedicar a regra de negócio.

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Ficou com alguma dúvida?