[Resolvido]Usando o Guice para injetar dependências

Olá pessoal, tudo bem?

Estou mudando o meu sistema de Spring para Guice…

Mas só com a mudança de jars já ocorrem exceptions.

[code]HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

com.google.inject.ProvisionException: Guice provision errors:

  1. null returned by binding at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.registerFactory(GuiceComponentRegistry.java:120)
    but parameter 4 of br.com.wsacervoweb.interceptor.PrivilegioInterceptor.<init>() is not @Nullable
    while locating br.com.caelum.vraptor.ioc.guice.ComponentFactoryProviderAdapter<br.com.wsacervoweb.enums.TipoTabelas>
    while locating br.com.wsacervoweb.enums.TipoTabelas
    for parameter 4 at br.com.wsacervoweb.interceptor.PrivilegioInterceptor.<init>(PrivilegioInterceptor.java:29)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)
    while locating br.com.wsacervoweb.interceptor.PrivilegioInterceptor

1 error
com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:977)
com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1003)
br.com.caelum.vraptor.ioc.guice.GuiceProvider$GuiceContainer.instanceFor(GuiceProvider.java:60)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:47)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:89)
br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
br.com.caelum.vraptor.ioc.guice.GuiceProvider.provideForRequest(GuiceProvider.java:76)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.29 logs.

Apache Tomcat/6.0.29
[/code]

Eu gostaria de usá-lo para fazer a dupla injeção de sessions (ora de um banco, ora de outro, diferenciados pelo @Named).

vc tem algum component factory que pode retornar null?

o guice não gosta disso por padrão, então se sim vc precisa anotar essa dependência como @Nullable no PrivilegioInterceptor

Ixi… Muitas pelo sistema todo… Existe alguma forma de tirar isso em um lugar só?

vc recebe várias dependências que podem ser null?

isso geralmente não é muito legal, já que te obriga a ficar fazendo if (x != null) pelo sistema inteiro…

tem um padrão (design pattern) chamado Null Object que pode te ajudar

Na verdade existe algumas coisas que eu devo fazer quando for nulo…

Então com esse Null Object eu retorno uma nova instância ao invés de retornar nulo?

isso, uma instância que se comporta como se fosse uma instancia normal, mas retorna os valores que vc usaria com os if (x != null)

e vc ainda poderia fazer algo do tipo:

public class Banjo {
    public static final Banjo NULL = new Banjo();
}

...

if (banjo == Banjo.NULL) {
    //lógica do null
}

em todo caso, a idéia do padrão não é mudar o if null pra if NULL, e sim evitar esses ifs

De qual pacote é o @Nullable?

Consegui resolver com a ideia de uma “instância nula”…

Como que eu faria depois quanto às SessionFactories com relação ao @SessionScoped?

eu criei o meu CustomProvider, como você disse no outro tópico. Só que ao contrário de SessionFactory, eu quero retornar Session, cada uma da respectiva SF.

Porém, como eu faço para receber neste provider uma SF anotada cm @Component e @SessionScoped? Pois eu queria usar a mesma SF por sessão…

abrir uma SF por sessão de usuário geralmente é bem caro… é isso mesmo que vc quer fazer? O ideal é ter uma SF por base de dados, e só.

o @Nullable é do guice (com.google.algumacoisa)

como está o código do seu provider?

os métodos anotados com @Provides podem receber dependências como parametro, e serem anotados com escopo:

@Provides @SessionScoped
public Coisa criaACoisa(Dependencia dependencia) {
   //...
}

Entendi, então os métodos anotados com @Provides funcionam como as classes anotadas com @Component.

Meu CustomProvider:

[code]package br.com.wsacervoweb.implementations;

import javax.inject.Named;

import org.hibernate.Session;

import br.com.caelum.vraptor.ioc.guice.GuiceProvider;

import com.google.inject.AbstractModule;
import com.google.inject.Module;
import com.google.inject.Provides;

public class CustomProvider extends GuiceProvider {

static class CustomModule extends AbstractModule {
	private final Module module;

	CustomModule(Module module) {
		this.module = module;
	}

	@Override
	protected void configure() {
		install(this.module);
		// configurations
	}

	@Provides
	public Session getSession() {
		// cria a session do banco da empresa
		return null;
	}

	@Provides
	@Named("WSAcervoWeb")
	public Session getSessionWSAcervoWeb() {
		// cria a session do banco da warriorsoft
		return null;
	}
}

@Override
protected Module customModule() {
	return new CustomModule(super.customModule());
}

}[/code]

O @Nullable que eu tenho é da Sun… Por isso não funcionou… Acho que eu não tenho esse jar do guice.

A ideia é que eu tenha uma SessionFactory que seja @ApplicationScoped e outra que seja @SessionScoped

Deve ser assim pois cada empresa acessa um banco de dados diferente.

-Edit-

Aqui diz que a anotação @SessionScoped não pode ser usada em métodos…

Estou usando o @Named de javax.injection mas eu tenho um outro aqui que é do google…

tenta fazer diferente então. Ao invés do @Provides, tente um @Component assim:

@Component @SessionScoped @Named("WSAcervoWeb")
public class SessionProvider implements Provider<Session> {
   //abra a session no construtor, retorne-a no método get e crie um método @PreDestroy que fecha a session
}

tanto faz usar o @Inject do google ou do javax.inject… melhor o do javax, que é spec

Eu devo tirar o CustomProvider?

Pois a minha aplicação “parou” de funcionar…

Geralmente quando isso acontece é só fazer os cleans… Mas dessa vez nao foi…

[code]HTTP Status 404 -

type Status report

message

description The requested resource () is not available.

Apache Tomcat/6.0.29[/code]

-Edit-

Agora que eu vi.

O Google me listou os erros.

Eu troquei os javax.inject.Named pelo com.google.inject.name.Named

Mas ainda assim, não funcionou. O Named do google não pode ser anotado em classes…

[code]03/08/2011 13:03:42 org.apache.catalina.core.StandardContext filterStart
GRAVE: Exception starting filter vraptor
com.google.inject.CreationException: Guice creation errors:

  1. No implementation for org.hibernate.Session was bound.
    while locating org.hibernate.Session
    for parameter 0 at br.com.wsacervoweb.dao.MidiaDAO.<init>(MidiaDAO.java:23)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

  2. No implementation for org.hibernate.SessionFactory annotated with @com.google.inject.name.Named(value=SessionFactoryWSAcervoWeb) was bound.
    while locating org.hibernate.SessionFactory annotated with @com.google.inject.name.Named(value=SessionFactoryWSAcervoWeb)
    for parameter 0 at br.com.wsacervoweb.implementations.SessionWSAcervoWebProvider.<init>(SessionWSAcervoWebProvider.java:21)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

  3. Binding to Provider is not allowed.
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.deepRegister(GuiceComponentRegistry.java:88)

  4. Could not find a suitable constructor in br.com.wsacervoweb.dao.UsuariosDAO. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private.
    at br.com.wsacervoweb.dao.UsuariosDAO.class(UsuariosDAO.java:23)
    while locating br.com.wsacervoweb.dao.UsuariosDAO
    for parameter 2 at br.com.wsacervoweb.dao.MidiaDAO.<init>(MidiaDAO.java:23)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

  5. Could not find a suitable constructor in br.com.wsacervoweb.vo.UsuarioAcervo. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private.
    at br.com.wsacervoweb.vo.UsuarioAcervo.class(UsuarioAcervo.java:35)
    while locating br.com.wsacervoweb.vo.UsuarioAcervo
    for parameter 0 at br.com.wsacervoweb.interceptor.AuntenticacaoInterceptor.<init>(AuntenticacaoInterceptor.java:20)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

  6. Could not find a suitable constructor in br.com.wsacervoweb.vo.UsuarioAcervo. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private.
    at br.com.wsacervoweb.vo.UsuarioAcervo.class(UsuarioAcervo.java:35)
    while locating br.com.wsacervoweb.vo.UsuarioAcervo
    for parameter 3 at br.com.wsacervoweb.dao.MidiaDAO.<init>(MidiaDAO.java:23)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

  7. An exception was caught and reported. Message: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
    at com.google.inject.util.Modules$RealOverriddenModuleBuilder$1.configure(Modules.java:172)[/code]

então faça o seguinte:

  • tire o @Component do SessionProvider

-no método configure do módulo, faça:

       @Override  
        protected void configure() {  
            install(this.module);  
            
            bind(Session.class).annotatedWith(Names.named("WS....")).toProvider(SessionProvider.class);
        } 

desse jeito, vc pode fazer coisas legais do tipo:

bind(Session.class).toProvider(new SessionProvider(sessionFactoryGeral));
bind(Session.class).annotatedWith(Names.named("WS....")).toProvider(new SessionProvider(sessionFactoryDoWS));
bind(Session.class).annotatedWith(Names.named("xxx")).toProvider(new SessionProvider(sessionFactoryDoXXX));

Agora ele lista um pouco mais de erros…

é assim que o CustomProvider deve estar?

[code]package br.com.wsacervoweb.implementations;

import org.hibernate.SessionFactory;
import org.hibernate.classic.Session;

import br.com.caelum.vraptor.ioc.guice.GuiceProvider;

import com.google.inject.AbstractModule;
import com.google.inject.Module;
import com.google.inject.name.Names;

public class CustomProvider extends GuiceProvider {

static class CustomModule extends AbstractModule {
	private final Module module;

	CustomModule(Module module) {
		this.module = module;
	}

	@Override
	protected void configure() {
		install(this.module);
		bind(SessionFactory.class).toProvider(SessionFactoryProvider.class);
		bind(SessionFactory.class)
				.annotatedWith(Names.named("WSAcervoWeb")).toProvider(
						SessionFactoryWSAcervoWebProvider.class);
		bind(Session.class).toProvider(SessionProvider.class);
		bind(Session.class).annotatedWith(Names.named("WSAcervoWeb"))
				.toProvider(SessionWSAcervoWebProvider.class);
	}
}

@Override
protected Module customModule() {
	return new CustomModule(super.customModule());
}

}[/code]
Aqui estão os erros:

[code]1) No implementation for org.hibernate.Session annotated with @com.google.inject.name.Named(value=WSAcervoWeb) was bound.
while locating org.hibernate.Session annotated with @com.google.inject.name.Named(value=WSAcervoWeb)
for parameter 5 at br.com.wsacervoweb.controller.MainController.<init>(MainController.java:46)
at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

  1. No implementation for org.hibernate.Session annotated with @com.google.inject.name.Named(value=WSAcervoWeb) was bound.
    while locating org.hibernate.Session annotated with @com.google.inject.name.Named(value=WSAcervoWeb)
    for parameter 0 at br.com.wsacervoweb.dao.EmpresaDAO.<init>(EmpresaDAO.java:19)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

  2. No implementation for org.hibernate.Session annotated with @com.google.inject.name.Named(value=WSAcervoWeb) was bound.
    while locating org.hibernate.Session annotated with @com.google.inject.name.Named(value=WSAcervoWeb)
    for parameter 0 at br.com.wsacervoweb.dao.UsuarioEmpresaDAO.<init>(UsuarioEmpresaDAO.java:31)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

  3. No implementation for org.hibernate.Session annotated with @com.google.inject.name.Named(value=WSAcervoWeb) was bound.
    while locating org.hibernate.Session annotated with @com.google.inject.name.Named(value=WSAcervoWeb)
    for parameter 0 at br.com.wsacervoweb.dao.UsuariosDAO.<init>(UsuariosDAO.java:23)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

  4. No implementation for org.hibernate.Session annotated with @com.google.inject.name.Named(value=WSAcervoWeb) was bound.
    while locating org.hibernate.Session annotated with @com.google.inject.name.Named(value=WSAcervoWeb)
    for parameter 3 at br.com.wsacervoweb.interceptor.LogInterceptor.<init>(LogInterceptor.java:26)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

  5. No implementation for org.hibernate.Session was bound.
    while locating org.hibernate.Session
    for parameter 3 at br.com.wsacervoweb.controller.ConsultaController.<init>(ConsultaController.java:44)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

  6. No implementation for org.hibernate.Session was bound.
    while locating org.hibernate.Session
    for parameter 4 at br.com.wsacervoweb.controller.MainController.<init>(MainController.java:46)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

  7. No implementation for org.hibernate.Session was bound.
    while locating org.hibernate.Session
    for parameter 6 at br.com.wsacervoweb.controller.RevisaoController.<init>(RevisaoController.java:55)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

  8. No implementation for org.hibernate.Session was bound.
    while locating org.hibernate.Session
    for parameter 5 at br.com.wsacervoweb.controller.UsuariosController.<init>(UsuariosController.java:43)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

  9. No implementation for org.hibernate.Session was bound.
    while locating org.hibernate.Session
    for parameter 0 at br.com.wsacervoweb.dao.AcervoDAO.<init>(AcervoDAO.java:21)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

  10. No implementation for org.hibernate.Session was bound.
    while locating org.hibernate.Session
    for parameter 0 at br.com.wsacervoweb.dao.ConveniadoDAO.<init>(ConveniadoDAO.java:24)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

  11. No implementation for org.hibernate.Session was bound.
    while locating org.hibernate.Session
    for parameter 0 at br.com.wsacervoweb.dao.MidiaDAO.<init>(MidiaDAO.java:23)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

  12. No implementation for org.hibernate.Session was bound.
    while locating org.hibernate.Session
    for parameter 0 at br.com.wsacervoweb.dao.TabelasDAO.<init>(TabelasDAO.java:27)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

  13. Could not find a suitable constructor in br.com.wsacervoweb.implementations.SessionFactoryProvider. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private.
    at br.com.wsacervoweb.implementations.SessionFactoryProvider.class(SessionFactoryProvider.java:1)
    at br.com.wsacervoweb.implementations.CustomProvider$CustomModule.configure(CustomProvider.java:24)

  14. Could not find a suitable constructor in br.com.wsacervoweb.implementations.SessionProvider. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private.
    at br.com.wsacervoweb.implementations.SessionProvider.class(SessionProvider.java:1)
    at br.com.wsacervoweb.implementations.CustomProvider$CustomModule.configure(CustomProvider.java:28)

  15. Could not find a suitable constructor in br.com.wsacervoweb.implementations.SessionWSAcervoWebProvider. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private.
    at br.com.wsacervoweb.implementations.SessionWSAcervoWebProvider.class(SessionWSAcervoWebProvider.java:1)
    at br.com.wsacervoweb.implementations.CustomProvider$CustomModule.configure(CustomProvider.java:29)[/code]

o problema são os 3 últimos erros:

Could not find a suitable constructor in br.com.wsacervoweb.implementations.SessionWSAcervoWebProvider. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private

anote os construtores dos providers com @Inject (vc tá usando a api direta do guice, em que a injeção pelo construtor não é automática)

Arrumei isso, ai eu vi um erro em relação aos Sessions, mudei o pacote( de org.hibernate.classic.Session para org.hibernate.Session, não sei bem a diferença) e ficou somente esse erro:

1) No implementation for org.hibernate.SessionFactory annotated with @com.google.inject.name.Named(value=SessionFactoryWSAcervoWeb) was bound. while locating org.hibernate.SessionFactory annotated with @com.google.inject.name.Named(value=SessionFactoryWSAcervoWeb) for parameter 0 at br.com.wsacervoweb.implementations.SessionWSAcervoWebProvider.&lt;init&gt;(SessionWSAcervoWebProvider.java:20) at br.com.wsacervoweb.implementations.CustomProvider$CustomModule.configure(CustomProvider.java:29)

troque o @Named(“SessionFactoryWSAcervoWeb”) por @Named(“WSAcervoWeb”) (foi assim que vc configurou no module)

Mas, na verdade, eu tenho dois casos. Um é o da session (“WSAcervoWeb”) e o outro é o da SessionFactory dessa session (“SessionFactoryWSAcervoWeb”)…

Eu devo anotar TODOS os construtores que recebem dependência com @Inject?

-Edit-
¬¬’
Agora eu vi o que vc quis dizer…

Arrumei, mas aí ele voltou a dar erro de objeto nulo…

1) null returned by binding at br.com.wsacervoweb.implementations.CustomProvider$CustomModule.configure(CustomProvider.java:24) but parameter 0 of br.com.wsacervoweb.implementations.SessionProvider.&lt;init&gt;() is not @Nullable while locating br.com.wsacervoweb.implementations.SessionFactoryProvider while locating org.hibernate.SessionFactory for parameter 0 at br.com.wsacervoweb.implementations.SessionProvider.&lt;init&gt;(SessionProvider.java:18) at br.com.wsacervoweb.implementations.SessionProvider.class(SessionProvider.java:1) while locating br.com.wsacervoweb.implementations.SessionProvider while locating org.hibernate.Session for parameter 4 at br.com.wsacervoweb.controller.MainController.&lt;init&gt;(MainController.java:46) at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110) while locating br.com.wsacervoweb.controller.MainController

no módulo vc colocou:

 bind(SessionFactory.class)  
                    .annotatedWith(Names.named("WSAcervoWeb")).toProvider(  
                            SessionFactoryWSAcervoWebProvider.class);

então vc tem que usar @Named(“WSAcervoWeb”) SessionFactory factory. Não tem problema usar o mesmo nome, desde que sejam classes/interfaces diferentes.

não são todos os construtores, são só os dos componentes que vc configurou direto no guice (com o module). Os do vraptor vão continuar do mesmo jeito que antes

É eu vi, entao eu editei a mensagem anterior.

Arrumei, mas aí ele voltou a dar erro de objeto nulo…

1) null returned by binding at br.com.wsacervoweb.implementations.CustomProvider$CustomModule.configure(CustomProvider.java:24) but parameter 0 of br.com.wsacervoweb.implementations.SessionProvider.&lt;init&gt;() is not @Nullable while locating br.com.wsacervoweb.implementations.SessionFactoryProvider while locating org.hibernate.SessionFactory for parameter 0 at br.com.wsacervoweb.implementations.SessionProvider.&lt;init&gt;(SessionProvider.java:18) at br.com.wsacervoweb.implementations.SessionProvider.class(SessionProvider.java:1) while locating br.com.wsacervoweb.implementations.SessionProvider while locating org.hibernate.Session for parameter 4 at br.com.wsacervoweb.controller.MainController.&lt;init&gt;(MainController.java:46) at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110) while locating br.com.wsacervoweb.controller.MainController