Como pegar uma instância através de um provider no Vraptor

Estou implementando um Validator que precisa acessar o banco de dados para fazer as validações. Então preciso ter acesso à session do Hibernate nesse validator. O problema é que o construtor do Validator tem que ser vazio, senão o Hibernate não sabe como criá-lo. Preciso de algo do tipo:

GuiceProvider provider = new GuiceProvider(); Container container = provider.getContainer(); session = container.instanceFor(Session.class);
Porém no exemplo acima “getContainer” está retornando null. Eu não entendo muito bem como funcionam esses frameworks de injeção de dependência. Mas tem alguma forma de conseguir uma instância de Session?

Você pode usar uma classe como essa:

https://groups.google.com/d/msg/caelum-vraptor/XOVLXFQ3qIQ/D88u52m1_fYJ

no seu caso vc vai precisar salvar num atributo estático pra ficar acessível do seu validator.

Não entendi como eu vou ter acesso à classe “Gambiarra” dentro do meu validator. E além disso, porque o código que eu postei não funciona? Num era pra funcionar?

você pode fazer:

@Component
@ApplicationScope
public class Gambiarra {
    private static Container container;
    public Gambiarra(Container container) {
        Gambiarra.container = container;
    }
    @PostConstruct
    public void init() {
       System.out.println("Gambiarra was made. Só pra invocar o construtor da classe");
    }
    public static Container getContainer() {
         return container;
    }
}

assim vc pode usar de qqer lugar Gambiarra.getContainer();

o seu código não funcionou pq a criação do GuiceProvider faz parte da inicialização do VRaptor, e só pode ter uma instância dele rodando. Mesmo que vc iniciasse outro GuiceProvider, vc não aproveitaria as mesmas instancias do resto da aplicação.

Hmm, entendi. Funcionou! :slight_smile: