[RESOLVIDO] - Erro ao injetar um ComponentFactory @ApplicationScope vRaptor

10 respostas
jweibe

Bom o que ta acontecendo e o seguinte eu crie dois componentes factory para o vRaptor ambos como escopo de aplicação.
Tomei como base este plugin criado pelo garcia-jj github.

Segue a classes que criei:
ComponentFactory<Configuration> (Hibernate 4)

@Component
@ApplicationScoped
public class ConfigurationCreator implements ComponentFactory&lt;Configuration&gt;{
	private Configuration cfg;
	
	@Override
	public Configuration getInstance() {
		return this.cfg;
	}

	@PostConstruct
	public void createComponent(){
		this.cfg = new Configuration().configure();
	}
	
	@PreDestroy
	public void destroyComponent(){
		this.cfg = null;
	}
}

ComponentFactory<ServiceRegistry> (Hibernate 4)

@Component
@ApplicationScoped
public class ServiceRegistryCreator implements ComponentFactory&lt;ServiceRegistry&gt;{
	private final Configuration cfg;
	private ServiceRegistry serviceRegistry;
	
	public ServiceRegistryCreator(Configuration cfg) {
                /* O problema esta aki!! O Configuration não esta sendo injetado 
                   (Obs: se eu colocar o ServiceRegistryCreator como escopo de request ou session funciona numa boa ) */
		this.cfg = cfg;
	}
	
	@Override
	public ServiceRegistry getInstance() {
		return this.serviceRegistry;
	}
	
	@PostConstruct
	public void createComponent(){
		ServiceRegistryBuilder builder = new ServiceRegistryBuilder();
		builder.applySettings(this.cfg.getProperties());
		this.serviceRegistry = builder.buildServiceRegistry();
	}
	
	@PreDestroy
	public void destroyComponent(){
		ServiceRegistryBuilder.destroy(this.serviceRegistry);
	}

}

Alguém tem alguma ideia do porque isto esta acontecendo…

10 Respostas

Lucas_Cavalcanti

ele dá erro, ou injeta null?

jweibe

Lucas ele ta indo como null ai quando eu vou usar ele no createComponent da classe ServiceRegistryCreator ele me joga o erro de Null Poiter.
Mais tipow uma coisa que eu puder perceber e que o meu método

@PostConstruct  
    public void createComponent(){  
        this.cfg = new Configuration().configure();  
    }

não esta sendo executado… e se eu chamar esse mesmo método no construtor da classe ConfigurationCreator e retirar a anotação @PostConstruct , tudo funciona numa boa.
A minha dúvida esta neste ponto, o meu método anotado como @PostConstruct não deveria ser invocado após o construtor?
Ou tem algum problema eu injetar um @ApplicationScoped dentro de outro @ApplicationScoped ?

Lucas_Cavalcanti

vc tá usando o pico, o spring ou o guice?

o PostConstruct deveria ser chamado sim… mas nesse caso ele funciona da mesma maneira que o construtor.

jweibe

Lucas Cavalcanti:
vc tá usando o pico, o spring ou o guice?

o PostConstruct deveria ser chamado sim… mas nesse caso ele funciona da mesma maneira que o construtor.

A Lucas como eu não entendi o porque do método não esta sendo chamado… eu to invocando o método no próprio construtor mesmo.
O container que eu estou usando e o Pico por que o Guice sem me gera um erro…

GRAVE: Exception starting filter vraptor
com.google.inject.CreationException: Guice creation errors:

1) No implementation for br.com.caelum.iogi.spi.DependencyProvider was bound.
  while locating br.com.caelum.iogi.spi.DependencyProvider
    for parameter 1 at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.<init>(VRaptorInstantiator.java:58)
  at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:141)

2) No implementation for br.com.caelum.iogi.spi.ParameterNamesProvider was bound.
  while locating br.com.caelum.iogi.spi.ParameterNamesProvider
    for parameter 3 at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.<init>(VRaptorInstantiator.java:58)
  at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:141)

2 errors
	at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:435)
	at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:154)
	at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106)
	at com.google.inject.Guice.createInjector(Guice.java:95)
	at com.google.inject.Guice.createInjector(Guice.java:83)
	at br.com.caelum.vraptor.ioc.guice.GuiceProvider.start(GuiceProvider.java:98)
	at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:108)
	at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:102)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3709)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4363)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
13/04/2012 14:16:03 org.apache.catalina.core.StandardContext start

É necessário fazer alguma configuração extra para usar o Guice?

Lucas_Cavalcanti

o pico não suporta o @PostConstruct/@PreDestroy

não deveria, vc tá com a versão mais nova do VRaptor? (3.4.1)
se não, precisa registrar o pacote do iogi no web.xml

jweibe

To usando a versão que esta disponível no site… a 3.4.1

Lucas_Cavalcanti

coloca isso no web.xml:

<context-param>
    <param-name>br.com.caelum.vraptor.packages</param-name>
    <param-value>br.com.caelum.vraptor.http.iogi</param-value>
</context-param>

se já tiver a conf de packages, adicione o do iogi separado por virgula

jweibe

Lucas Cavalcanti:
coloca isso no web.xml:

<context-param>
    <param-name>br.com.caelum.vraptor.packages</param-name>
    <param-value>br.com.caelum.vraptor.http.iogi</param-value>
</context-param>

se já tiver a conf de packages, adicione o do iogi separado por virgula

Agora sim Lucas funcionou blzinha!!! Só uma dúvida qual dos dois container e mais leve Guice ou Pico?

Lucas_Cavalcanti

os dois são quase equivalentes… o guice faz mais coisas, mas o pico é um pouquinho mais leve

jweibe

Certo!! mais vlw Lucas, muito obrigado pelos seus esclarecimento. xD

Criado 13 de abril de 2012
Ultima resposta 13 de abr. de 2012
Respostas 10
Participantes 2