Boa tarde galera,
estou com erro quando tento validar um tipo primitivo. Ao testar o envio de uma String em um input que deveria ser um inteiro (afinal o usuário pode digitar qualquer coisa na view, por isso esse teste ) eu recebo esse erro:
br.com.caelum.vraptor.http.InvalidParameterException: Exception when trying to instantiate Target(name=vinho, type=class br.com.wjconsulting.cardapiodigitalv4.model.Vinho)
at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.handleException(VRaptorInstantiator.java:128)
at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.handleException(VRaptorInstantiator.java:130)
at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.instantiate(VRaptorInstantiator.java:120)
at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.instantiate(VRaptorInstantiator.java:112)
...
Caused by: java.lang.IllegalArgumentException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
Pesquisado um pouco, cheguei nesse post aqui onde o Lucas_Cavalcanti pedia que ativasse o DEBUG para visualizar os parâmetros passados na requisição. Ao fazer isso eu tenho essa saída:
14:19:44,720 DEBUG [DefaultControllerTranslator] trying to access /vinhos
14:19:44,721 DEBUG [DefaultControllerTranslator] found controller [DefaultControllerMethod: public void br.com.wjconsulting.cardapiodigitalv4.controller.VinhoController.adiciona(br.com.wjconsulting.cardapiodigitalv4.model.Vinho)]
14:19:44,721 DEBUG [CDIBasedContainer ] asking cdi to get instance for class br.com.wjconsulting.cardapiodigitalv4.controller.VinhoController
14:19:44,721 DEBUG [CDIBasedContainer ] beans for class br.com.wjconsulting.cardapiodigitalv4.controller.VinhoController is [Managed Bean [class br.com.wjconsulting.cardapiodigitalv4.controller.VinhoController] with qualifiers [@Any @Default]]
14:19:44,723 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for public void br.com.wjconsulting.cardapiodigitalv4.controller.VinhoController.adiciona(br.com.wjconsulting.cardapiodigitalv4.model.Vinho) as [vinho]
14:19:44,731 DEBUG [IogiParametersProvider] IogiParametersProvider is up
14:19:44,734 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for public void br.com.wjconsulting.cardapiodigitalv4.controller.VinhoController.adiciona(br.com.wjconsulting.cardapiodigitalv4.model.Vinho) as [vinho]
14:19:44,735 DEBUG [IogiParametersProvider] getParametersFor() called with parameters Parameters(Parameter(vinho.volume -> ), Parameter(vinho.codigo -> ), Parameter(vinho.produtor -> ), Parameter(vinho.anoSafra -> isso é um teste), Parameter(vinho.percentualAlcoolico -> ), Parameter(vinho.tipoVinho.id -> 2), Parameter(vinho.descricao -> ), Parameter(vinho.pais.id -> 1), Parameter(vinho.regiao -> ), Parameter(vinho.preco -> ), Parameter(vinho.nome -> )) and targets [Target(name=vinho, type=class br.com.wjconsulting.cardapiodigitalv4.model.Vinho)].
14:19:44,752 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for public br.com.wjconsulting.cardapiodigitalv4.model.Vinho() as []
14:19:44,769 DEBUG [CDIBasedContainer ] asking cdi to get instance for class br.com.caelum.vraptor.converter.PrimitiveIntConverter
14:19:44,769 DEBUG [CDIBasedContainer ] beans for class br.com.caelum.vraptor.converter.PrimitiveIntConverter is [Managed Bean [class br.com.caelum.vraptor.converter.PrimitiveIntConverter] with qualifiers [@Any @Default]]
O parâmetro em questão é Parameter(vinho.anoSafra -> isso é um teste)
da classe Vinho. anoSafra
é um int
. Mais abaixo temos uma linha interessante:
14:19:44,769 DEBUG [CDIBasedContainer ] beans for class br.com.caelum.vraptor.converter.PrimitiveIntConverter is [Managed Bean [class br.com.caelum.vraptor.converter.PrimitiveIntConverter] with qualifiers [@Any @Default]]
Esse é o Converter responsável por converter os parâmetros para int. Uma vez que eu informei um String para uma variável que é inteira, eu não deveria cair no NumberFormatException
e consequentemente ter na view uma mensagem do tipo: ???is_not_a_valid_number???
?
O que é mais estranho é que na mesma classe eu tenho um BigDecimal
e tenho o comportamento esperado: ao informar uma String, eu tenho o erro de conversão, como dito no livro do Vraptor vendido na Casa do Código
“Esses erros são adicionados automaticamente pelo Vraptor se o valor mandado na requisição não puder ser convertido para o tipo necessário” página 79
Se alguém tiver uma luz do que seja, fico grato.
Abraços pra todos.