Estou com os seguintes jars no classpath (hibernate-validator-4.0.1.GA.jar e validation-api-1.0.0.GA.jar), mas analisando o log, aparentemente o vraptor não chama o validador.
@Path("/veiculo/add")publicvoidsave(Veiculoveiculo){validator.validate(veiculo);validator.onErrorUse(logic()).forwardTo(getClass()).form();veiculos.add(veiculo);result.include("message","Veículo adicionado com sucesso!");result.redirectTo(this).list();}
É preciso criar alguma implementação da interface BeanValidator e anotar com @Component ou o vraptor sabe delegar para alguma baseado nos jars do classpath?
Durante o startup do tomcat nenhuma mensagem de erro aparece no log (em DEBUG level)
Hmm, você precisa fazer simplesmente injetar o Validator e depois chamar validator.validate. Você fez certo. Quando o Vraptor é inicializado ele procura pelas classes tanto do Bean Validator quanto do Hibernate Validator 3x e habilita quais ele encontrar.
Se você habilitar o debug do Vraptor notará a mensagem abaixo no seu console. Dê uma olhada nela.
wpivotto
Então Garcia, eu notei isso analisando o código fonte do vraptor.
Essa mensagem não aparece do log do startup. O engraçado é que em teoria o vraptor deveria passar para o DefautValidator o NullBeanValidator, se algum problema ocorresse, não é?
Mas a mensagem "You are willing to validate an object, but there is no bean validation engine registered. Please add the jars of some implementation of JSR 303 or Hibernate Validator." deveria ocorrer quando eu chamasse o validate, mas isso também não ocorre.
Mas os jars estão corretos pois eu consigo rodar este teste
publicclassVeiculosTest{privatestaticValidatorvalidator;@BeforeClasspublicstaticvoidsetUp(){ValidatorFactoryfactory=Validation.buildDefaultValidatorFactory();validator=factory.getValidator();}@TestpublicvoidplacaInvalida(){Veiculoveiculo=newVeiculo();veiculo.setPlaca("X");Set<ConstraintViolation<Veiculo>>constraintViolations=validator.validate(veiculo);assertEquals(1,constraintViolations.size());assertEquals("must match \"[A-Z]{3}-[0-9]{4}\"",constraintViolations.iterator().next().getMessage());}@TestpublicvoidveiculoValido(){Veiculoveiculo=newVeiculo();veiculo.setPlaca("MMM-1111");Set<ConstraintViolation<Veiculo>>constraintViolations=validator.validate(veiculo);assertEquals(0,constraintViolations.size());}}
G
garcia-jj
Estranho... muito estranho. Ele deveria mostrar algo.
Penso talvez alguma classe em um nível acima da sua aplicação possa estar escondendo algo. Você está com algum jar do vraptor dentro do container ao invés de estar na aplicação? Esses jars (hibernate-validator-4.0.1.GA.jar e validation-api-1.0.0.GA.jar) estão na sua aplicação ou no container. O correto é estarem todos na aplicação.
Uma coisa que você pode fazer para teste é rodar um controller que faça uma instanciação do bean validator factory com a aplicação UP.
Você tem os jars do Hibernate Validator 4x. Mas você tem os jars do Hibernate Validator 3x? Não precisa (e nem deve) ter o do 3x, mas penso que talvez possa haver algum conflito.
Estou usando aqui em um projeto em glassfishv3 e funcionando bem.
wpivotto
garcia-jj:
Você tem os jars do Hibernate Validator 4x. Mas você tem os jars do Hibernate Validator 3x? Não precisa (e nem deve) ter o do 3x, mas penso que talvez possa haver algum conflito.
Estou usando aqui em um projeto em glassfishv3 e funcionando bem.
Não, não tenho…
Se retiro o método da validação tudo funciona, testei em outros controllers, de outros projetos e acontece a mesma coisa.
O mais loco é que a requisição é processada até o fim, mas não é lançada nenhuma exception, nem é feito o redirect do result ou o forward do validator…
Lucas_Cavalcanti
faz o seguinte teste:
receba no construtor de algum controller uma List (import do vraptor), e imprima a lista…
posta aqui o que veio…
wpivotto
Então Lucas, olha só o método do meu controller
@Path("/veiculo/add")publicvoidsave(Veiculoveiculo){System.out.println(validators);for(BeanValidatorvalidator:validators){validator.validate(veiculo);//validator.onErrorUse(logic()).forwardTo(getClass()).form();}veiculos.add(veiculo);result.include("message","Veículo adicionado com sucesso!");result.redirectTo(this).list();}
e analisando a saída o validador correto é passado mas não valida o objeto
Lucas, acho que isso é o caso do NPE quanto não é chamado o lazy-initializing do ValidatorFactory. Só achei estranho ele estar escondendo o NPE e seguindo o fluxo como se nada tivesse acontecido.