[Resolvido] Mesma sessão para usuários diferentes usando @SessionScoped do VRaptor

[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

Entendi. Obrigado!