[RESOLVIDO] @Component @ApplicationScope inicialização

15 respostas
R

Estou utilizando esse código para preencher alguns dados iniciais em uma aplicação de teste. Mas, parece que o componente não está sendo chamado - a mensagem não aparece no console.
Além disso, retirei a inicialização da lista para forçar uma NullPointerException mas não apareceu. Estou utilizando a versão 3.3.0 do VRaptor.

@Component
@ApplicationScoped
public class DefaultData 
{

	private final List<Item> items;
	
	public DefaultData()
	{
		System.out.println("Essa mensagem não aparece no console....");
		items = new ArrayList<Item>();
		items.add(new Item("Chave", 20.0));
	}

	public List<Item> getItems() 
	{
		return items;
	}

}

15 Respostas

Lucas_Cavalcanti

a gente refatorou a parte da integração do VRaptor com o Spring nessa última versão, e esse comportamento de inicializar as classes @ApplicationScoped junto com a aplicação foi perdido…

estou investigando o porquê disso e tentando corrigir. Se vc não usa nada do Spring, troque os jars do spring pelos do guice que esse problema será resolvido.

talvez vc precise anotar o método que gera a lista com @PostConstruct.

Lucas_Cavalcanti

consegui corrigir esse problema,

testa com esse snapshot e com o spring mesmo, por favor:
https://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.3.1-SNAPSHOT/vraptor-3.3.1-20110204.165640-2.jar

R

Com o Spring continua não mostrando. Mudei para o Guice e funcionou.

Lucas_Cavalcanti

vc colocou o snapshot e tirou o jar do 3.3.0?

deu um clean no projeto e no servidor?

deveria estar funcionando com o spring também…

mas se vc não precisa do spring, use guice, pq ele é mais rápido =)

R

Não está funcionando. Até quando você falou achei que não tivesse dado o clean. Mas, não está funcionando mesmo.

1) Peguei o VRaptor-blank-project
2) Troquei o 3.3.0 pelo 3.3.1
3) Importei o projeto para o Eclipse
4) Criei um @Component simples:

@Component
@ApplicationScoped
public class DefaultData 
{

	public DefaultData()
	{
		System.out.println("É para funcionar mesmo usando Spring.");
	}
	
}

5)Rodei o servidor

Não mostrou a mensagem. Enquanto o outro projeto usando Guice mostrou.

Lucas_Cavalcanti

se vc colocar um método anotado com @PostConstruct funciona?

R

Agora funcionou… mesmo sem o @PostConstruct.

Aparentemente, fiz os mesmos passos que antes. (Antes havia testado mais de uma vez com clean e rebuild). Obrigado!

R

EDITADO: Resolvido http://www.guj.com.br/java/227087-resolvido-exception-ao-injetar-um-component-numa-classe-aplicationscoped/1

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘defaultData’: Unsatisfied dependency expressed through constructor argument with index 0 of type [br.com.caelum.vraptor.blank.Manager]: : Error creating bean with name ‘manager’: Scope ‘request’ is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘manager’: Scope ‘request’ is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:698)

Esse é um bug da integração do VRaptor + Spring ou eu estou fazendo algo errado?

Isso acontece quando injeto algo em um component anotado no escopo da aplicação:

@Component @ApplicationScoped public class DefaultData { public DefaultData(Manager manager) { System.out.println("Chamou o Default Data..."); this.manager = manager; } private final Manager manager; }

@Component public class Manager { public Manager() { System.out.println("Chamou o manager..."); } }

Lucas_Cavalcanti

DefaultData é AppScoped e Manager é RequestScoped, por isso não funciona.

psico.indie

Existe alguma forma de usar um objeto RequestScoped dentro de um ApplicationScoped?

Lucas_Cavalcanti

se os métodos do applicationScoped forem chamados dentro de request sim…

se vc tá usando o guice, vc recebe no construtor um Provider componente, e faça qdo for chamar:

componente.get().metodo();
psico.indie

Preciso justamente do contrário. Preciso injetar um RequestScoped dentro de um ApplicationScoped. Dentro do ApplicationScoped, preciso chamar métodos do requestsscoped.

Lucas_Cavalcanti

a solução que eu falei é exatamente pra isso.

psico.indie

Isso só funciona se estiver usando o guice?

Lucas_Cavalcanti

a do provider sim… o spring tem uma solução tb que é o Scoped Proxy… mas talvez tenha que configurar a dependência direto no spring.

Criado 4 de fevereiro de 2011
Ultima resposta 13 de nov. de 2012
Respostas 15
Participantes 3