[Resolvido]Usando o Guice para injetar dependências

31 respostas
Rafael_Guerreiro

Olá pessoal, tudo bem?

Estou mudando o meu sistema de Spring para Guice...

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

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

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

31 Respostas

Lucas_Cavalcanti

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

Rafael_Guerreiro

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

Lucas_Cavalcanti

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

Rafael_Guerreiro

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?

Lucas_Cavalcanti

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
}
Lucas_Cavalcanti

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

Rafael_Guerreiro

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…

Lucas_Cavalcanti

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) {
   //...
}
Rafael_Guerreiro

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

Meu CustomProvider:

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());
	}

}

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...

Lucas_Cavalcanti

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

Rafael_Guerreiro

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...
HTTP Status 404 -

type Status report

message

description The requested resource () is not available.

Apache Tomcat/6.0.29

-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...

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.&lt;init&gt;(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.&lt;init&gt;(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.&lt;init&gt;(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.&lt;init&gt;(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.&lt;init&gt;(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)
Lucas_Cavalcanti

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));
Rafael_Guerreiro

Agora ele lista um pouco mais de erros...

é assim que o CustomProvider deve estar?
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());
	}
}
Aqui estão os erros:
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.&lt;init&gt;(MainController.java:46)
  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.EmpresaDAO.&lt;init&gt;(EmpresaDAO.java:19)
  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.UsuarioEmpresaDAO.&lt;init&gt;(UsuarioEmpresaDAO.java:31)
  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 0 at br.com.wsacervoweb.dao.UsuariosDAO.&lt;init&gt;(UsuariosDAO.java:23)
  at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

5) 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.&lt;init&gt;(LogInterceptor.java:26)
  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 3 at br.com.wsacervoweb.controller.ConsultaController.&lt;init&gt;(ConsultaController.java:44)
  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 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)

8) No implementation for org.hibernate.Session was bound.
  while locating org.hibernate.Session
    for parameter 6 at br.com.wsacervoweb.controller.RevisaoController.&lt;init&gt;(RevisaoController.java:55)
  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 5 at br.com.wsacervoweb.controller.UsuariosController.&lt;init&gt;(UsuariosController.java:43)
  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.AcervoDAO.&lt;init&gt;(AcervoDAO.java:21)
  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.ConveniadoDAO.&lt;init&gt;(ConveniadoDAO.java:24)
  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.MidiaDAO.&lt;init&gt;(MidiaDAO.java:23)
  at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

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

14) 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)

15) 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)

16) 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)
Lucas_Cavalcanti

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)

Rafael_Guerreiro

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)

Lucas_Cavalcanti

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

Rafael_Guerreiro

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

Lucas_Cavalcanti

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

Rafael_Guerreiro

É 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

Lucas_Cavalcanti

talvez se vc criar uma anotação @Nullable funcione :wink:

Rafael_Guerreiro

Criei a annotation Nullable e então o sistema funciona certinho.

Mas agora vem o problema:

A SessionFactory que não tem o @Named só pode ser criada depois que a pessoa fizer o login…
Pois eu só consigo construir essa SessionFactory depois de saber os dados da empresa da pessoa…
Não tenho a mínima ideia de como fazer isso…

Lucas_Cavalcanti

a sem o @Named mesmo?

vc pode fazer um provider que recebe as informações do usuário, e cria a sf de acordo com ele

Rafael_Guerreiro

Como que seria esse provider? Mas ele teria que ser executado depois q a pessoa fizer o login…

Lucas_Cavalcanti

o mesmo provider que vc já criou…

só que lá dentro em algum lugar vc faz:

if (sf == null && usuario está logado) {
    sf = cria sf
}

só que dai ele potencialmente vai retornar null no get

Rafael_Guerreiro

Eu posso receber parâmetros no CustomProvider? Ele é executado o tempo todo?

Lucas_Cavalcanti

o provider que eu to falando é o SessionFactoryWSAcervoWebProvider ou coisa do tipo…

se não for o cara anotado, vc pode criar um ComponentFactory e fazer a lógica lá

Rafael_Guerreiro

Ahh! Isso eu já faço, só que o problema é que ele é @SessionScoped, entao ele fica retornando null para sempre…

Lucas_Cavalcanti

não entendo pq ele fica null sempre…
vc tá recebendo as informações de usuário nessa classe?

vc tá fazendo o if maroto dentro do getInstance()? (o getInstance é chamado toda hora)

Rafael_Guerreiro

Não, ele fica no construtor… Se uma hora ele mudar a classe que contém as informações sobre o usuário, lá vai mudar também? (Sem que seja preciso receber de novo?)

Lucas_Cavalcanti

vc pode ficar fazendo a verificação sempre no getInstance ao invés de no construtor… aí vc consegue trocar as informações

Rafael_Guerreiro

Consegui resolver o problema, dessa forma como você disse…

Eu tinha me confundido e colocado o @Named em um lugar onde a session deveria ser a padrão…

Obrigado por todo o suporte!

Criado 2 de agosto de 2011
Ultima resposta 3 de ago. de 2011
Respostas 31
Participantes 2