Bug vraptor 3 + guice (Injecao de dependencia)

Tenho um cenario que é o seguinte

package a.repository;
public interface TipoRecursoHumanoRepository {
}

package a.repository.impl;
import a.repository.TipoRecursoHumanoRepository;
@Component
public class TipoRecursoHumanoRepositoryImpl implements
		TipoRecursoHumanoRepository {
}

package b.repository;
public interface TipoRecursoHumanoRepository {
}

package b.repository.impl;
import b.repository.TipoRecursoHumanoRepository;
@Component
public class TipoRecursoHumanoRepositoryImpl implements
		TipoRecursoHumanoRepository {
}

Entao são 2 interfaces diferentes com suas respectivas implementações , só possuem o mesmo nome em comum .

A que esta no pacote ‘a’ veio de um jar de outro projeto que vou usar tambem como dependencia . E a que esta no pacote ‘b’ foi implementada no proprio projeto . Quando tento injetar a b no costrutor de um controller ou repositorio ele tenta fazer cast pra que veio no jar dando class cast exception . Exemplo :

package b.controller;
import b.repository.TipoRecursoHumanoRepository;

@Resource
public class MyController {
          private  TipoRecursoHumanoRepository repository;
         MyController(TipoRecursoHumanoRepository repository){
              this.repository = repository;
         }
}

estoura a exception classcastexception:

can't cast b.repository.TipoRecursoHumanoRepository to a.repository.TipoRecursoHumanoRepository

mesmo usando nome qualificado no construtor do fonte nao resolveu , agora se eu troco o nome da implementacao do pacote ‘b’ para TipoRecursoHumanoRepositoryImplB ai funciona certinho . Creio ser um bug isso , agora nao sei se é do vraptor na hora de registrar os componentes ou do guice na hora de buscar a implementacao . Procede isso ?

o vraptor publica o componente no request com um atributo com o nome da classe com letra minúscula… se tem duas classes com o mesmo nome, ele vai se perder mesmo, infelizmente.

o jeito de resolver isso é nomear o seu componente… creio que se vc colocar @Named(“algum_nome”) em cima da classe o componente é registrado com esse nome…

em todo caso, não diria que isso é um bug, é uma limitação. Uma correção possível é dar nomes melhores pras implementações da interface. Ao invés de XXXImpl, algo como HibernateXXXX ou JPAXXXX, ou seja, a tecnologia da implementação.

[quote=Lucas Cavalcanti]o vraptor publica o componente no request com um atributo com o nome da classe com letra minúscula… se tem duas classes com o mesmo nome, ele vai se perder mesmo, infelizmente.

o jeito de resolver isso é nomear o seu componente… creio que se vc colocar @Named(“algum_nome”) em cima da classe o componente é registrado com esse nome…

em todo caso, não diria que isso é um bug, é uma limitação. Uma correção possível é dar nomes melhores pras implementações da interface. Ao invés de XXXImpl, algo como HibernateXXXX ou JPAXXXX, ou seja, a tecnologia da implementação.[/quote]

É alterei o nome de uma das implementações e já funcionou , reportei foi mas pra talvez voces melhorarem isso . Mas o correto não seria o vraptor publicar o componente com nome qualificado completo quando registra ? pacote+classe ? assim mesmo nesse cenario ele nao se perderia pelo que entendi , mas nao sei o tamanho do impacto disso pois nao olhei esse trecho de codigo . Bom fica reportado o problema.

mas assim a gente não consegue acessar via ${nomeDoComponent} no jsp :wink: