Pessoal, tenho um projeto que usa EJB + CDI Beans. Essa semana extraí esses componentes e criei um projeto para poder trabalhar com CDI Beans no VRaptor. O projeto está aqui:
https://github.com/garcia-jj/vraptor-plugin-cdi. A documentação é muito fraca e não escrevi ainda os testes, pois ele ainda é apenas uma
idéia inicial.
Para usar em meu projeto bastaria então injetar o ServiceLocator nas classes e chamar ServiceLocator.get(MeuBean.class, AlgumQualifier.class). Só que chamar assim é chato, prefiro injetar diretamente meus CDI Beans.
Como uso EJB com interface local/remota, criei uma factory para cada interface. Sendo assim eu crio algo do tipo:
public class RateServiceFactory implements ComponentFactory<RateServiceLocal> {
private final ServiceLocator serviceLocator;
public RateServiceFactory(ServiceLocator serviceLocator) { this.serviceLocator = serviceLocator;
} public RateServiceLocal getInstance() {
return serviceLocator.get(RateServiceLocal.class); }
}Agora caí no problema de ter que criar
uma factory para cada EJB. O que antes era chato ficou mais ainda. Pelo menos agora eu consigo injetar meus beans de forma mais inteligente, e para contornar isso criei um builder do Eclipse + Javassist que gera estas classes em tempo de build, algo parecido com o hibernate-modelgen. Mesmo assim não fiquei satisfeito, porque mesmo sendo automatizadas, essas classes tinham que ser geradas.
Então pergunto: há uma forma mais pratica sem ter que criar uma ComponentFactory para cada CDI Bean? Tentei fazer uns testes sobrescrevendo o Container conforme código abaixo, mas acabei ganhando um StackOverflowError, por motivos obvios. O delegate recebido no construtor acaba sendo a própria instância, entrando em loop infinito.
public class CustomContainer implements Container { private Container delegate;
[...]}
Pensei em último caso sobrescrever direto a implementação do Guice (preferia deixar cross-provider). Dessa forma recebo o erro abaixo:
1) No implementation for icob.model.service.RateServiceLocal was bound.
while locating icob.model.service.RateServiceLocal for parameter 5 at icob.web.controller.CustomerController.<init>(CustomerController.java:45)
at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:129)O que vocês me sugerem?