[b]Bom dia,
Estou com um problema em que usuários diferentes da minha aplicação possuem a mesma sessão fazendo com que ocorram problemas de navegação na aplicação quando usuários diferentes estão usando o sistema. Estou usando o framework Vraptor e suas anotações.
Na minha aplicação existe a classe Usuario anotada como @Service e @SessionScoped.
Essa classe Usuario é instanciada automaticamente em outro construtor que está anotado com @Autowired.
Alguém teria alguma ideia do porquê esses usuários diferentes estarem acessando a mesma sessão?
vc usou o @Service do spring e o @SessionScoped do VRaptor… daí o bean virou singleton ao invés de sessionScoped.
ou vc usa:
@Service
@Scope("session")
ou:
@Component // do VRaptor
@SessionScoped
Ok, anotei minha classe assim:
@Service
@Scope(“session”)
public class UserSession {
private User user;
private Customer customer;
private String typeServer;
As sessoes agora são diferentes para cada usuario, mas nas minhas classes de implementação, como SubCategoryRepositoryImpl, não é possivel anotar como @Autowired o UserSession, e se deixo sem anotar não consigo instancia-lo, vem como nulo.
pq não? o que acontece?
pq vc não recebe as dependências pelo construtor?
Já tentei pelo construtor também, dá o mesmo erro.
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘subCategoryRepositoryImpl’ defined in URL [jar:file:/opt/apache/tomcat/6.0.14/webapps/menuIpad-web/WEB-INF/lib/menuIpad-core-0.0.1-SNAPSHOT.jar!/br/com/mbs/mobile/core/sub/category/SubCategoryRepositoryImpl.class]: Unsatisfied dependency expressed through constructor argument with index 1 of type [br.com.mbs.mobile.core.session.UserSession]: : Error creating bean with name ‘userSession’: Scope ‘session’ 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 ‘userSession’: Scope ‘session’ 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.
Como estou tentando fazer:
private UserSession userSession;
@Autowired
public SubCategoryRepositoryImpl(SpringBeansSupplier springBeansSupplier, UserSession userSession) {
this.userSession = userSession;
}
....
protected Criteria createWithExample(SubCategory subCategory) {
Criteria criteria = defaultCriteria();
criteria.add(Restrictions.eq("customer",
userSession.getCustomer())); //Sem não colocar @autowired não instancia
return criteria;
}
Antes quando era anotado como @SessionScoped e @Service isto não ocorria, não estou entendendo oque pode ser.
o que acontece é que esse SubCategoriaRepositoryImpl é de um escopo maior que sessão… se vc usou alguma anotação do spring ele é singleton. Se vc quer que o Spring crie toda requisição, use o @Component do VRaptor, ou use @Scope(“request”) em cima da classe.
se ela precisar ser singleton, vc precisa brincar com scoped proxies, que é mais chato de configurar.
Lucas vlw, deu certo aqui. Ficou assim:
[code]@Service
@Scope(“session”)
public class UserSession {
private User user;
private Customer customer;
private String typeServer;
…
[/code]
[code]@Scope(“request”)
@Repository
public final class SubCategoryRepositoryImpl extends DefaultDao
implements SubCategoryRepository {
@Autowired
private UserSession userSession;
…
protected Criteria createWithExample(SubCategory subCategory) {
Criteria criteria = defaultCriteria();
criteria.add(Restrictions.eq(“customer”, userSession.getCustomer()));
return criteria;
}
…
[/code]
Só uma curiosidade se poder me responder, porque que o bean fica singleton quando uso o @Service do spring e o @SessionScoped do VRaptor.
Obrigado.
pq o @Service é uma anotação do Spring, e o @SessionScoped é do VRaptor. Se é o spring que está registrando as classes, vc tem que usar as regras do Spring (escopo padrão é singleton, e forma de mudar o escopo é com o @Scope)
pra usar o @SessionScoped do VRaptor, o bean tem que estar anotado com o @Component do VRaptor