[RESOLVIDO] @SessionScope vraptor parece nao funcionar

ola a todos.
Estou usando @SessionScope e @Component na classe abaixo.
porem o atributo senha não fica na sessão.
o campo int m que é para teste, fica na sessão, pq inicio com 0 e depois quando autentica fica com 36, e ai no proximo request ele continua com 36.
porem se eu mudar o numero para 40 e reiniciar o tomcat ele mostra 36 e demora para mostrar 40.

outra duvida e quando o vraptor da o start na sessão?

package br.com.agile.sistema.negocio;

import java.io.Serializable;
import java.util.Date;

import br.com.agile.sistema.model.Senha;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;

@Component
@SessionScoped
public class Logado implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 6851281174307159289L;
	
	private Senha senha;
	
	private int m = 0;
	
	public Date time;
	
	public Logado(){
		System.out.println("logado novo");
		this.time = new Date();
	}
	
	public Senha getSenha() {
		return senha;
	}

	public void setSenha(Senha senha) {
		this.senha = senha;	
		
	}
	
	public boolean isLogado(){

		System.out.println(this.getM());
		
		boolean _isLogado = false;
		
		_isLogado = this.getSenha() != null;
		
		_isLogado = (_isLogado) && (this.getSenha().getId() != null);

		_isLogado = (_isLogado) && (this.getSenha().getId()>0);

		this.setM(36);
		System.out.println("----");
		return _isLogado;
		
	}

	public int getM() {
		return m;
	}

	public void setM(int m) {
		this.m = m;
	}

}

Eai Salsicha blz?

vou tentar esclarecer sua dúvida!

Primeira pergunta… quem cuida da HTTP Session? O vraptor ou o servidor web?

Servidor Web, ou seja, o vraptor não tem nada a ver com isso! rs

O vraptor não dá start na sessão ele usa a session do servidor web, ele sim dá o start na session, pq ele sabe identificar o usuário… ele que gerencia essas responsabilidades de sessão… o vraptor apenas utiliza as informações que está no container, que no seu caso é o tomcat!
quando vc anota o seu bean com o @SessionScoped, toda vez que vc precisar dele o vraptor pergunta pro container se a session! isNew() se sim ele te retorna um novo obj para aquele usuário, caso o contrário, ele te retorna o msm obj!

vc vai entender melhor sobre a HTTPSession nessa API(http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpSession.html) que está muito bem explicada por sinal!

se vc quer que o tomcat não faça o redeploy da aplicação… limpa o cache dele… pausa o tomcat e dah um clean tomcat work directory…
ou tb cria um opção no seu controller pra deslogar o seu usuário da sessão!

espero que tenha ajudado!

abrass!

obrigado pela ajuda.

Mas acredito que a responsabilidade é do vraptor.

olhe o que ocorre

  • ele está conseguindo salvar o objeto na sessão http.
  • só que altero valor dos atributos dele, atributos tipo int.
  • na requisição seguinte a injeção não vem com o valor alterado e sim o iniciado.
  • mas objeto na sessão é o mesmo ele não recria.

da impressão que tem que atualizar ele na sessao.

O Vraptor UTILIZA O HTTPSession, é diferente!

nesse caso eu vou dar uma olhada no que pode ser, ou o lucas pode nos ajudar tb! Mas muito estranho! Deveria alterar!

Só pra não te deixar com dúvida!

The servlet container(TOMCAT no seu caso) uses this interface to create a session between an HTTP client and an HTTP server.

font : http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpSession.html

Mas isso não tem nada a ver com o problema! Se vc alterou o objeto deveria ter mudado o valor! tem como vc postar como vc implementou?

talvez vc esteja chamando o isLogado() depois de setar esse novo valor! aí o valor volta a ser 36… não sei se vc percebeu… mas esse valor é setado com ele logado ou não!

opa td bem,
a noite eu posto.
agora uma coisa que percebi que pode ter influencia e que eu recebo o Logado por injeção e vou passando ele por parametros e lá dentro de outro metodo ele sofre alteração.
mas acho que não pq a referencia e a mesma.

em todo caso obrigado pela ajuda e noite eu posto mais detalhhado o codigo.
valeu

opa Kadu blza
eu fiz um teste de sessão aqui e realmente ele grava certinho.
eu consegui resumir meu bloco de codigo para aonde realmente da erro.
abaixo temos o objeto logado @Component e @SessionScope eu recebo da view o objeto senha a classe dele e anotada com @Resource,
adiciono a senha no logado e ai depois que chamo o forwardto o objeto senha some do logado.
valeu

	@Path("/login/realizar/")
	@NoInterceptLogado
	public void realizar(Senha senha, Logado logado) throws Exception {
	
		//o atributo senha tem que ficar na sessao
		logado.setSenha(senha);

		this.result.forwardTo(PrincipalController.class).inicio();
	}

cara to fazendo teste aqui…
coloquei uma mensagem no construtor do Logado que é logado novo,
eu retirei o forwardTo, e dexei ele acessar a pagina /projeto/login/realizar/,
nela seto a senha no logado como no post acima, e chamo um incrementador, que sai na mensagem antes 0 e depois 1
no realizar.jsp tem um link , que ao clicar nele percebe que ele cria o logado a cada clique.
segue o log…
[color=blue]
login contruido

Apresentando os Sessions da Sessao 6B60EE8961EDF0F11AF08319AD486840
nova sessao false
br.com.agile.sistema.negocio.Logado@12d391f8

org.springframework.web.context.request.DestructionCallbackBindingListener@143a70

criando LogadoIntercept validador de login
realizar aqui recebe por injeção o objeto Logado
logado novo aqui ta certo primeira inserção do logado
antes 0
depois 1

segundo acesso
login contruido
Apresentando os Sessions da Sessao 6B60EE8961EDF0F11AF08319AD486840
nova sessao false
br.com.agile.sistema.negocio.Logado@12d391f8

org.springframework.web.context.request.DestructionCallbackBindingListener@143a70

criando LogadoIntercept validador de login
realizar aqui recebe por injeção o objeto Logado
logado novo erro nao deveria inserir novamente
antes 0 aqui deveria ser 1
depois 1 aqui deveria ser 2

[/color]
percebe-se pelo httpsession que o Logado@12d391f8 é mesmo de todas requisições

não receba o Logado no método e sim no construtor do controller… o que vc recebeu no método não é o que veio da sessão.

ola bom dia Lucas e a todos.
obrigado pela informação vou testar e dou retorno.

VALEU GENTE.
coisa simples porem não lembro de ter visto algo sobre este detalhe na documentação.

http://vraptor.caelum.com.br/pt/docs/componentes/

aqui ele sempre fala pra receber os @Component no construtor. Não fala para receber no método.

No método do controller até funciona, mas só pra dependencias que são interfaces.