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

8 respostas
M

[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?

8 Respostas

L

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
M

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.

L

pq não? o que acontece?

pq vc não recebe as dependências pelo construtor?

M

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.

L

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.

M

Lucas vlw, deu certo aqui. Ficou assim:

@Service
@Scope("session")
public class UserSession {
 private User user;
 private Customer customer;
 private String typeServer;

...
@Scope("request")
@Repository
public final class SubCategoryRepositoryImpl extends DefaultDao<SubCategory>
  implements SubCategoryRepository {
 
 @Autowired
 private UserSession userSession;

...

protected Criteria createWithExample(SubCategory subCategory) {
  Criteria criteria = defaultCriteria();
  criteria.add(Restrictions.eq("customer", userSession.getCustomer())); 
  return criteria;
 }
...

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.

L

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

M

Entendi. Obrigado!

Criado 13 de fevereiro de 2012
Ultima resposta 13 de fev. de 2012
Respostas 8
Participantes 2