Sobrescrever setter do domain com validação
17/10/2012 21:36
0
Pessoal, boa noite, tudo bem?

Estou com o seguinte problema, em um domain meu sobrescrevi o método setter de uma das minhas propriedades e nele fiz uma validação q lança uma RuntimeException, até ae tudo bem, o problema ocorre que quando gravo um valor no banco e ao fazer o find o meu setter eh chamado e com isso a validação é feita novamente e a RuntimeException é lançada, isso apenas ao carregar o meu domain do banco de dados.

Alguém já passou por algum problema parecido? Alguém teria alguma solução para que eu consiga deixar a minha validação no meu método setter e quando carregar o objeto do banco não seja acionada? Necessariamente precisarei criar um service apenas para chamar a validação que poderia ficar no meu setter?

Desde já agradeço a atenção.
Tags: grails, domain, setter, exception, find


0
Olá, Carlos.

Amigo, se puder mandar o código de pelo menos teu "setter" ajuda muito na nossa análise.

Abraços.


0
Opa, tem sim José... segue abaixo:

class MyDomain {
String identificador
Status status = Status.EM_FILA

public void setStatus(Status status) {
this.@status = status.possoMudarStatus(this)
}
}

O que acontece, meu enum de Status tem 3 valoers(EM_FILA, PROCESSANDO e FINALIZADO) e a logica do metodo possoMudarStatus é simplesmente só posso ir de um para outro exatamente assim:
EM_FILA -> PROCESSANDO -> FINALIZADO

Qualquer situação do tipo
EM_FILA -> FINALIZADO
Uma exception é lançada, no meu caso uma RuntimeException

Pois bem se no banco de dados eu tenho um registro já setado com o status FINALIZADO, quando o registro é carregado no objeto ele vai passar pelo meu setter, no meu caso no setStatus, e como o valor default do objeto é EM_FILA, ele vai tentar setar o valor FINALIZADO e com isso será lançado a exception!

Espero que tenha ajudado com o exemplo, desde já agradeço a atenção.


0
Carlos,

desculpe mas ainda não entendi...

O erro dá SEMPRE que recupera um registro do banco ou SOMENTE SE o campo de "status" já estiver lá com o valor "EM_FILA"?

Abraços.


0
Só por curiosidade,

porque colocou o '@' antes do nome da variavel 'status' em:
this.@status = status.possoMudarStatus(this)
19/10/2012 12:24


0
Dificilmente é uma boa idéia sobrescrever o setter de uma classe que vai ser usada num ORM. Você não tem muito controle sobre quando o setter vai ser chamado, da margem pra vários problemas.

Tente pensar numa lógica que não precise sobrescrever o setter.

Analisando rapidamente o problema, talvez se você criar uma propriedade nova você consiga fazer uma validação via constraint mesmo. Ex:

class MyDomain {
Status statusAnterior
Status status

static constraint {
status( validator : { val, obj ->
return obj.statusAnterior.possoMudarStatus(val)
} )
}
}


No seu controller só vai ter que copiar o status, pro statusAnterior antes de atribuir o status novo.
19/10/2012 15:56



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto