[Resolvido] Vraptor Validações de modelo

Estou implementando o modelo de pessoal Juridica onde tenho que fazer a validadação de CNPJ, estou a procura da melhor forma de fazer essa validação…

primeiro coloquei ela no Modelo assim:

public class PessoaJuridica extends Pessoa {

	private String nomeFantasia;

	private String cnpj;
....
	public void setCnpj(String cnpj) throws Exception {
		if (cnpj != null) {
			if (Validacao.cnpj(cnpj)) {
				this.cnpj = cnpj;
			} else {
				throw new Exception("CNPJ Inválido!");
			}
		}
	}
}

E depois coloquei dentro do Controler dessa forma

	@Post(value = "/pessoa")
	public void Pessoa(PessoaJuridica pessoa) {

                if (pessoa.getCnpj != null) {
			if (!Validacao.cnpj(pessoa.getCnpj)) {
                             validator.add(new ValidationMessage("CNPJ invalido", "erro"));
			}
		}
		result.use(Results.json()).from(pessoa).serialize();
	}

Qual a forma “correta” de fazer validações desse tipo?

Um problema que vejo dentro do 2 modelo e que caso eu tenho um objeto que dentro tenha uma pessoa juridica que será cadastrada na hora terei que fazer essa mesma validação em outro controler.

Isso já não funcionaria, o VRaptor iria executar o setCNPJ para popular o objeto pessoa e receberia uma exception. Se eu não me engano, ele já vai considerar isso uma ValidationException.

Uma boa prática é você lançar IllegalArgumentException ou IllegalStateException.

Dê uma olhada no Caelum Stella, eles têm esses validadores de CNPJ, CPF…

Acho que você consegue integrar com o Hibernate Validator e já dar uma mensagem padrão…

Rafael primeiramente Obrigado.

Sim, estava com esse problema no primeiro modelo… estava procurando como tratar esse exception no vraptor…

Coloquei o Stela no projeto funciona muito bem… a configuração é simples.

Só tenho que ver agora as validações que não tem no Stela como irei fazer para transformar em Mensagens padrões.

Uma delas é a Suframa

Obrigado

se o setter lançar uma exception anotada com @ValidationException (do vraptor), a mensagem de validação já é adicionada automaticamente

@Audited
@Entity
@DiscriminatorValue("PessoaJuridica")
@ValidationException
public class PessoaJuridica extends Pessoa {

	private String nomeFantasia;

	@CNPJ(message = "CNPJ Inválido.", formatted = false)
	private String cnpj;


	private String suframa;
	
	public void setSuframa(String suframa) throws Exception {
		if (suframa != null) {
			if (Validacao.isuf(suframa)) {
				this.suframa = suframa;
			} else {
				throw new Exception("Suframa Inválido!");
			}
		}
	}

A validação não foi adicionada… o que fiz de errado?

Esquece entendi que o set ou a classe deveria estar anotada com @ValidationException, mas na verdade é uma exception anotada. já posto a solução

Versão do vraptor 3.4.1

Obrigado Lucas e Rafael… no final a solução foi a seguinte.

Criar uma exception anotada com @ValidationException


import br.com.caelum.vraptor.validator.annotation.ValidationException;

@SuppressWarnings("serial")
@ValidationException
public class ParametroIlegalException extends RuntimeException {
	public ParametroIlegalException(String message) {
		super(message);
	}
}

E lançar essa exception no set do parametro.

	public void setSuframa(String suframa) throws ParametroIlegalException {
		if (suframa != null) {
			if (Validacao.isuf(suframa)) {
				this.suframa = suframa;
			} else {
				throw new ParametroIlegalException("Suframa Inválido!");
			}
		}
	}

ele dá a exception no controller? o parametro é setado pelo formulario?

Sim da exception no controller.
Sim O parametro é setado pelo formulario.

Controller ficou assim

	@Post(value = "/pessoa")
	public void Pessoa(PessoaJuridica pessoa) {
		validator.validate(pessoa);
		validator.onErrorSendBadRequest();
.....

		
	}

pessoa.getSuframa() está preenchido nesse ponto?

Sim está… Agora acredito que funcionando perfeitamente.