Onde você cola a validação do seu domínio?

Bom, tenho esta dúvida.

Já coloquei na controladora e no domínio.
Mas dando uma olhada no google achei esta blogada: http://blog.rodrigoallemand.com.br/?p=141

Vocês acham que vale a pena utilizar deste padrão “Specification”?

Onde vocês colocam a validação dos seus domínios?

E como eu poderia fazer algo legal utilizando e continuar usando o Validator do VRaptor?

Tentei me controlar, mas não deu… isso é o tipo de padrão que nunca deve ser usado.

O método só retorna true ou false. Se der um erro você simplesmente volta para a tela anterior dizendo “Ocorreu um erro”, é? O feedback ao usuário é muito importante, e jamais deve ser omitido onde estão os erros. Como vou saber se o erro é email inválido, telefone sem DDD ou se o nome está vazio?

Na documentação do vraptor há bons exemplos de como fazer uma validação decente, inclusive usando o Bean Validation.

[quote=garcia-jj]Tentei me controlar, mas não deu… isso é o tipo de padrão que nunca deve ser usado.

O método só retorna true ou false. Se der um erro você simplesmente volta para a tela anterior dizendo “Ocorreu um erro”, é? O feedback ao usuário é muito importante, e jamais deve ser omitido onde estão os erros. Como vou saber se o erro é email inválido, telefone sem DDD ou se o nome está vazio?

Na documentação do vraptor há bons exemplos de como fazer uma validação decente, inclusive usando o Bean Validation.[/quote]

E você faz sua validação onde?

discordo que o padrão nunca deve ser usado, mas o amigo garcia-jj tem razão quando diz que “o feedback ao usuário é muito importante” e o próprio autor do artigo dá a luz à sua dúvida:

http://blog.rodrigoallemand.com.br/?p=186.

eu usaria o Bean Validations do java mesmo ao invés de fazer esse trabalho todo para validações do modelo (nome não pode ser vazio, etc)…

agora para validações de negócio (só pode passar pra próxima fase se fez 500 pontos) faria sentido fazer esse Specification, e pra continuar a usar o VRaptor vc pode criar uma interface nova:

public interface SpecValidator extends Validator {
     <T> void check(T obj, Specification<? super T> spec);
}

e uma implementação:

@Component
public class DefaultSpecValidator implements SpecValidator {
    public DefaultSpecValidator(Validator delegate) {
         this.delegate = delegate;
    }
   //no eclipse use ctrl+3 generate delegate methods e selecione tudo

   public <T> void check(T obj, Specification<? super T> spec) {
        delegate.checking(new Validations() {{
            that(spec.isSatisfiedBy(obj), "categoria", "msg");
        }});
   }
}

daí vc recebe esse validator no construtor.

[quote=Lucas Cavalcanti]eu usaria o Bean Validations do java mesmo ao invés de fazer esse trabalho todo para validações do modelo (nome não pode ser vazio, etc)…

agora para validações de negócio (só pode passar pra próxima fase se fez 500 pontos) faria sentido fazer esse Specification, e pra continuar a usar o VRaptor vc pode criar uma interface nova:

public interface SpecValidator extends Validator {
     <T> void check(T obj, Specification<? super T> spec);
}

e uma implementação:

@Component
public class DefaultSpecValidator implements SpecValidator {
    public DefaultSpecValidator(Validator delegate) {
         this.delegate = delegate;
    }
   //no eclipse use ctrl+3 generate delegate methods e selecione tudo

   public <T> void check(T obj, Specification<? super T> spec) {
        delegate.checking(new Validations() {{
            that(spec.isSatisfiedBy(obj), "categoria", "msg");
        }});
   }
}

daí vc recebe esse validator no construtor.[/quote]

Eu estou fazendo a validação para adicionar dados dentro do meu próprio domínio.
Acabo amarrando o domínio ao VRaptor, pelo fato desde método de validação receber um Validator para adicionar os erros. Mas atualmente não acho que está validação é um problema.

Achei legal o esquema de Specification, mas não sei se valeria para todas as situações, principalmente as mais simples onde só são verificados dados de cadastros simples.

esse specValidator é só pra vc criar um Validator bombado com a funcionalidade de Specifications, a idéia é substituir o do vraptor por isso.

em todo caso, acho que o Bean Validations resolve a maioria dos problemas