[Resolvido] VRaptor 3 + Injeção de Dependência

Olha eu mais uma vez por aqui, to levando canseira…hehe.

Continuando nos meus estudos, dei uma lida no Hibernate Validator e gostei da idéia para usar junto com o VRaptor. Aí fui querer injetar uma dependência, mas parece que isso não rola com generics, pelo que pesquisei na net (Talvez pelo lance de os genéricos só estarem disponíveis em tempo de compilação). Alguém poderia confirmar isso? Em caso positivo, alguém sabe de algum workaround?

Meu ComponentFactory:

[code]package br.com.revelacaovirtual.person;

@Component
@ApplicationScoped
public class PersonValidatorCreator implements ComponentFactory<ClassValidator> {

@Override
public ClassValidator<Person> getInstance() {	
	return new ClassValidator<Person>(Person.class);
}

}
[/code]

Meu web.xml:

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>digital-do-vale</display-name> <filter> <filter-name>vraptor</filter-name> <filter-class>br.com.caelum.vraptor.VRaptor</filter-class> </filter> <filter-mapping> <filter-name>vraptor</filter-name> <url-pattern>/*</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> </filter-mapping> <context-param> <param-name>br.com.caelum.vraptor.provider</param-name> <param-value>br.com.caelum.vraptor.util.jpa.JPACustomProvider</param-value> </context-param> <context-param> <param-name>br.com.caelum.vraptor.packages</param-name> <param-value>br.com.revelacaovirtual</param-value> </context-param> </web-app>

Meu StackTrace:

SEVERE: Exception starting filter vraptor java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl cannot be cast to java.lang.Class at br.com.caelum.vraptor.ioc.ComponentFactoryIntrospector.targetTypeForComponentFactory0(ComponentFactoryIntrospector.java:43) at br.com.caelum.vraptor.ioc.ComponentFactoryIntrospector.targetTypeForComponentFactory(ComponentFactoryIntrospector.java:29) at br.com.caelum.vraptor.ioc.spring.ComponentFactoryBean.<init>(ComponentFactoryBean.java:38) at br.com.caelum.vraptor.ioc.spring.ComponentScanner.postProcessBeanDefinition(ComponentScanner.java:80) at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:210) at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.scan(ClassPathBeanDefinitionScanner.java:183) at br.com.caelum.vraptor.ioc.spring.ComponentScanner.scan(ComponentScanner.java:98) at br.com.caelum.vraptor.ioc.spring.VRaptorApplicationContext.loadBeanDefinitions(VRaptorApplicationContext.java:94) at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130) at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:458) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:388) at br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.start(SpringBasedContainer.java:68) at br.com.caelum.vraptor.ioc.spring.SpringProvider.start(SpringProvider.java:79) at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:110) at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:103) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275) at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397) at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108) at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3800) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4450) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardHost.start(StandardHost.java:722) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) at org.apache.catalina.core.StandardService.start(StandardService.java:516) at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) at org.apache.catalina.startup.Catalina.start(Catalina.java:583) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)

Estou com a mesma dúvida !

Nenhum Guru no Fórum? Por eqto estou instanciando na mão mesmo, e se não for possível fazer, farei uma factory para isso. Mas se tiver solução com injeção msm, ficaria mais contente.

Esse ClassValidator é da sua aplicação? ou é de algum framework?

se eu não me engano o Spring não suporta mto bem generics, tanto faz se vc colocou ClassValidator ou ClassValidator

nesse caso específico não vale a pena fazer um componentFactory… pq vc não vai conseguir receber um ClassValidator no construtor das classes…

vc pode fazer:

@Component  
@ApplicationScoped  
public class PersonValidator extends ClassValidator<Person> {
   
     public PersonValidator() {
         super(Person.class)
     }
}

e receber PersonValidator no construtor das classes

Ou não vale mais a pena já usar o validator do vraptor, que inclusive possui integração com o hibernate-validator?

A propósito, Lucas, já começaram os trabalhos com a JSR303? Dei uma olhada nesse feriadão e mudou completamente, bem dizer não é mais o validator que conheciamos, hehe.

:twisted: Ribamar mudou de foto?

Welcome back!

Vlw Lucas. Sabia que ou vc, ou o garcia iam me ajudar :smiley:
Ei Garcia, esse validator é o do Hibernate mesmo. Gostei da arquitetura dele. Não sabia que a Validação do VRaptor estava integrada com ele, como faz pra usar essa integração? É o que está na documentação o VRaptor?
Vou te contar, a facu foi boa por causa dos conceitos, mas para as questões práticas, o buraco é mais embaixo.

[]s e obrigado.

http://vraptor.caelum.com.br/documentacao/validacao/

Se você der uma olhada nessa página tem lá embaixo como funciona a integração com o hibernate validator. O Lucas pode te dizer melhor como funciona essa integração. Mas pelo que lí no site basta você anotar seus beans e fazer algo como:

[code]public adiciona(Funcionario funcionario) {
//Validação do Funcionario com Hibernate Validator
validator.add(Hibernate.validate(funcionario));

validator.checking(new Validations(){{
    that(!funcionario.getNome().isEmpty(), "erro","nomeNaoInformado");
}});

dao.adiciona(funcionario);

}[/code]

garcia-jj Boa Tarde Mudei sim, essa ficou melhorzinha !

Minha filha que tirou !

Grande Abraço Mano bom trabalho ai !

Jr.

Vlw Garcia. Realmente já tinha lido essa parte, mas na hora de mostrar na view, por exemplo em um form, uma mensagem de erro, eu ia ter então que fazer alguma lógica para procurar na lista errors que o VRaptor adiciona no Result? Seria isso então? De repente até usar um AJAX para fazer a validação quando o cara sai do componente?

Também seria bom se os atributos desse errors estivesse na documentação…hehe. Se forem os mesmos do Hibernate, aí podia só comentar lá.

Pelo que sei os erros são retornados na variável ${error} no JSP.

Então, no manual está que ele retorna uma lista de errors nesse JSP, inclusive ele faz um loop no JSP de exemplo pra mostar a categoria e mensagem. Então basicamente, se eu kiser colocar essa mensagem ao lado do respectivo campo, pelo jeito eu vou ter que fazer alguma lógica para isso.

Acho que o Lucas pode dar alguma sugestão de como implementar algo mais interessante, mas dá para pensar em alguma gambiarra. Uma coisa que eu fiz no meu sistema é pegar o nome do bean e propriedade e a partir dele buscar qual o campo e mostrar a mensagem do lado do campo.

Abraços

[quote=garcia-jj]Acho que o Lucas pode dar alguma sugestão de como implementar algo mais interessante, mas dá para pensar em alguma gambiarra. Uma coisa que eu fiz no meu sistema é pegar o nome do bean e propriedade e a partir dele buscar qual o campo e mostrar a mensagem do lado do campo.

Abraços[/quote]

Exatamente isso que quero fazer. Conhece algum tutorial bom sobre JSP pra eu estudar? ou vc faz isso com JavaScritp? A parte java é razoavelmente trankila, quando chega na view que a coisa desanda…hehe.

Garcia, qdo eu ficar rico, 50% é teu :lol:

Aproveitando para informar o pessoal do VRaptor, na documentação, para usar a validação do Hibernate consta pra usar o método add do validator, e no caso, é pra usar o addAll. Nada que não seja “descobrível”, mas se de repente alguém tiver problema…

[quote=garcia-jj]
A propósito, Lucas, já começaram os trabalhos com a JSR303? Dei uma olhada nesse feriadão e mudou completamente, bem dizer não é mais o validator que conheciamos, hehe.[/quote]
Não implementamos nenhum suporte para essa jsr ainda, só o Hibernate Validator por enquanto

O ideal é que pra mostrar os erros na frente dos campos se use a validação do lado do cliente (via javascript com JQuery ou similares), e as validações do lado do servidor (via vraptor) serem mostradas juntas em algum canto da página, afinal a validação do lado do cliente já deveria pegar tudo, evitando requisições “inválidas”

Todos os campos dos erros já estão na documentação: erro.message e erro.category :stuck_out_tongue:

Vlw Lucas. Usei a integração com Hibernate, e realmente ficou muito bom. Vou procurar por esse JQuery, estava procurando um norte para estudar JSP, JavaScript e AJAX e coisas do gênero. Vlw pela ajuda, foi de grande valia.

[quote=Lucas Cavalcanti][quote=garcia-jj]
A propósito, Lucas, já começaram os trabalhos com a JSR303? Dei uma olhada nesse feriadão e mudou completamente, bem dizer não é mais o validator que conheciamos, hehe.[/quote]
Não implementamos nenhum suporte para essa jsr ainda, só o Hibernate Validator por enquanto[/quote]

Hmm, se você quiser uma contribuição posso fazer algo para isso, já que semana que vem estou mais calmo nos projetos. Mas primeiro vou ver como é o validator atual.

Aliás ví que tem uma issue para isso lá no github.

contribuições são sempre bem-vindas =)