vRaptor - atualizar classe de sessao [RESOLVIDO]

Eai galera!

to com uma duvida cruel que ta ferrando meu sistema…
tipo, ao atualizar o objeto Pessoa, quando eu recupero-a logo em seguida, parece que nao esta atualizada…
para atualizar eu tenho que deslogar do sistema e logar novamente para ver as alteraçoes feitas…
alguem sabe como posso controlar isso?

aqui ta a minha classe que fica a mesma durante a sessao… tem como dar um refresh, por exemplo, no getNome() ?

[code]package br.com.website.entidade;

import java.io.Serializable;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;
import br.com.website.bean.Usuario;
import br.com.website.componentes.cripto.CreateAndSaveAESKey;
import br.com.website.componentes.cripto.EncryptData;

@Component
@SessionScoped
public class UsuarioWeb implements Serializable {

private Usuario logado; 

public void login(Usuario usuario) {
	this.logado = usuario;
}

public String getNome() {
	return logado.getPessoa().getNome();
}

}[/code]

Oi, tefo.

Em princípio, o que me ocorre é perguntar se você está atualizando o seu “logado” quando você atualiza o nome.

Ou seja, creio que você deva ter um método “setUsuario( usuario )”, no seu “UsuarioWeb”. Então, quando você atualizar os dados do seu usuário em qualquer lugar deveria também atualizar o “logado”. Algo como:

Usuario usuario = usuarioDAO.getUsuario();
usuario.setNome( "tefo" );
usuarioWEB.setUsuario( usuario ); // Talvez falte uma linha como essa

Assim ele também atualiza o “logado” e quando você pegar o “logado” em qualquer outra parte ele estará atualizado. Caso contrário, ele só vai atualizar quando for chamado pela primeira vez ou quando a página for recarregada.

Talvez seja isso.

Abraço,
Almir.

é só vc receber no construtor o UserWeb e tocar o usuário com o que foi feito no banco.

Obrigado pela ajuda Almir e Rafael…

eu atualizei o logado da classe UsuarioWeb apos atualizar o objeto Pessoa… e ai ta blz…
soh que ta acontecendo uma coisa estranha…
quando eu carrego do banco uma pessoa, ela tem um List de atributos que no banco tem dados e quando eu recupero esta vazia: []

alguem sabe pq acontece isso?

vc faz um pessoa.getAtributos() e não funciona, mesmo esses atributos sendo salvos no banco?

Acho que é o Lazy do Hibernate.

Depois que vc carregar um usuário, faz um

Se depois disso ela estiver populada, ve se não vale a pena configurar a sua classe para que o Hibernate faça essa chamada para você.

os atributos sumiam quando eu atualizava uma pessoa…
agora antes de atualizar uma pessoa eu obtenho os que exitem no banco e atribuo-os para a pessoa que serah atualizada, isso funcionou…
eu achava estranho porque os atributos continuavam na tabela no banco, mesmo testando com o Hibernate.initialize nao acontecia nada… entao verifiquei a tabela de ligaçao entre a pessoa e os atributos e vi que apenas essa tabela perdeu os dados…

obrigado pela força pessoal!!
desculpem o incomodo

[quote=tefo]os atributos sumiam quando eu atualizava uma pessoa…
agora antes de atualizar uma pessoa eu obtenho os que exitem no banco e atribuo-os para a pessoa que serah atualizada, isso funcionou…
eu achava estranho porque os atributos continuavam na tabela no banco, mesmo testando com o Hibernate.initialize nao acontecia nada… entao verifiquei a tabela de ligaçao entre a pessoa e os atributos e vi que apenas essa tabela perdeu os dados…

obrigado pela força pessoal!!
desculpem o incomodo[/quote]

Não há incômodo, tefo. Todos nós aprendemos com as questões aqui colocadas. Continue postando!

Sds,
Almir.

Obrigado pela força Almir.
Unidos venceremos!! :lol:

Boa noite galera,

Sei que esse post já e antigo mas estou precisando muito!! estou com esse mesmo problema e sou novato na programação já tentei de varias formas mais não deu certo alguém poderia me mostrar como faço para atualizar os dados do usuário logado se ter a necessidade de fazer logout no sistema?

se você tem uma classe @SessionScoped, é só recebê-la no construtor e chamar métodos que modificam ela.

[quote=Lucas Cavalcanti]se você tem uma classe @SessionScoped, é só recebê-la no construtor e chamar métodos que modificam ela.

[/quote]

boa noite Lucas,

Então a minha classe session esta assim


import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;
import br.com.mkt_inteligente.model.Cliente;

@Component
@SessionScoped
public class ClienteWeb  {
	
	private Cliente logado;
	

	public  void login(Cliente cliente){
		this.logado = cliente;
	}
	
	public String getNome(){
		return logado.getNome();
	}
	
	
	public Long getIdCliente() {
		return logado.getIdCliente();
	}
	
	public String getEmail() {
		return logado.getEmail();
	}
	
	public String getNumeroTelefone() {
		return logado.getNumeroTelefone();
	}
	
	public boolean isLogado(){
		return logado != null;
	}
	
	public void logout(){
		this.logado = null;
	}
	

}

Minha Controlle está assim


@Resource
public class ClienteController {
	
	private ClienteDao dao;
	private Result result;
	private Validator validator;
	private ClienteWeb clienteWeb;
	
	public ClienteController(ClienteDao dao,Result result, Validator validator, ClienteWeb clienteWeb){
		this.dao = dao;
		this.result = result;
		this.validator = validator;
		this.clienteWeb = clienteWeb;
	}


	@Put("/clientes/{idCliente}")
	public void altera(Cliente cliente){
		dao.atualiza(cliente);
		dao.recarrega(cliente);
		result.use(Results.logic()).redirectTo(ClienteController.class).homeCliente();  
	}

Devo inserir um construtor no ClienteWeb?

não… mas vc precisa fazer algo como

clienteWeb.login(cliente);

em alguma parte do código.

Boa noite Obrigado Lucas,

Inserir a linha que você disponibilizou no método altera e funcionou diretinho.

@Put("/clientes/{idCliente}")  
    public void altera(Cliente cliente){  
        dao.atualiza(cliente);  
        dao.recarrega(cliente);  
        clienteWeb.login(cliente);
        result.use(Results.logic()).redirectTo(ClienteController.class).homeCliente();    
    }