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@ApplicationScopedpublicclassDefaultData{privatefinalList<Item>items;publicDefaultData(){System.out.println("Essa mensagem não aparece no console....");items=newArrayList<Item>();items.add(newItem("Chave",20.0));}publicList<Item>getItems(){returnitems;}}
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.
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.