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.