Num determinado ponto do meu código eu preciso injetar uma dependência cuja única informação que eu tenho é a classe dela. Ou seja, dada uma classe, preciso injetar uma instância dessa classe. Mas eu só tenho como definir que classe vai ser em tempo de execução. Como posso fazer isso no Vraptor 4? No Vraptor 3 eu fazia assim:
[code]@Component
@ApplicationScoped
public class Components {
private static Container container;
public Components(Container container) {
Components.container = container;
}
public static <T> T get(Class<T> classe) {
if (container.canProvide(classe)) {
return container.instanceFor(classe);
}
return null;
}
}
[/code]
Então eu fazia Components.get(MinhaClasse.class) e recebia a instância. Mas to meio perdido no Vraptor 4. Como faço?
para o VRaptor 4:
@Startup //pra rodar na inicialização
@ApplicationScoped
public class Components {
private static Container container;
Components() {}
@Inject
public Components(Container container) {
Components.container = container;
}
public static <T> T get(Class<T> classe) {
if (container.canProvide(classe)) {
return container.instanceFor(classe);
}
return null;
}
}
Não funcionou… O campo container tá ficando null. Eu preciso adicionar alguma dependência específica pra esse código funcionar?
Em que situação vc está usando essa classe?
Eu tenho um validator do Hibernate que precisa acessar o banco. Mas pra isso eu preciso saber o Dao referente ao model que eu to lidando. Então, na minha annotation da validação eu criei uma propriedade “daoClass”, onde eu recebo a classe do Dao daquele model. Conclusão: eu tenho, por exemplo, um UsuarioDao.class e com isso preciso pegar uma instância dessa classe, fazendo Components.get(UsuarioDao.class). Eu faço essa chamada dentro do meu validator.
Tem um outro caso que eu preciso desse método também. Eu criei um converter pra qualquer classe de modelo minha. Assim, quando eu tenho um tipo “Usuario” e recebo num form o número 2, o meu converter é chamado e ele busca o usuário de id 2 no banco. Mas esse converter é único pra qualquer classe de modelo. Aí eu caio no mesmo caso: eu preciso pegar o dao específico daquele modelo, fazendo algo do tipo: Components.get(modelo.getDaoClass()).
Em ambos os casos eu estou recebendo null.
Desculpa a demora. Fiquei meio sem tempo nas últimas semanas. Mas testei aqui e funcionou! 
Obrigado.