[RESOLVIDO]vRaptor - component nao mantem objeto na sessão

4 respostas
M

seguinte, possuo uma classe que faz o controle de um objeto na sessao para mim.

@Component
@RequestScoped
public class EmpresasWeb {
	
	private HttpSession session;
	private List<Empresa> empresas = new ArrayList<Empresa>();
	private HttpServletRequest request;
	
	public EmpresasWeb(HttpSession session, HttpServletRequest request) {
		this.session = session;
		this.request = request;
		inserirEmpresaNaSessao();
	}
	
	public void inserirEmpresaNaSessao() {
		if(this.request.getSession().getAttribute("empresas") == null) {
			this.request.getSession().setAttribute("empresas", this.empresas);			
		}
	}

	@SuppressWarnings("unchecked")
	public List<Empresa> getEmpresas() {
		if(this.request.getSession().getAttribute("empresas") != null) {
			return (List<Empresa>) this.request.getSession().getAttribute("empresas");
		}
		return empresas;
	}

	public void setEmpresas(List<Empresa> empresas) {
		this.empresas = empresas;
	}
	
}

e estou usando isso no meu controller Usuario

@Resource
public class UsuarioController {
	
	private final UsuarioRepositorio userRep;
	private final Result result;
	private final EmpresaRepositorio empresaRep;
	private final EmpresasWeb empresas;
	
	public UsuarioController(UsuarioRepositorio rep, Result result, EmpresaRepositorio empresaRep, EmpresasWeb empWeb) {
		this.userRep = rep;
		this.result = result;
		this.empresaRep = empresaRep;
		this.empresas = empWeb;
	}
	
	public void formulario() {
		
	}
	
	public List<Usuario> listar() {
		return this.userRep.listAll();
	}
	
	public void salvar(Usuario usuario) {
		Integer codigo = usuario.getCodigo();
		if(codigo == null || codigo == 0) {
			List<UsuarioCompany> companies = povoaUsuarioCompany(usuario);
			usuario.setEmpresas(companies);
			usuario.getPermissao().add("ROLE_USUARIO");
			usuario.setAtivo(true);
			this.userRep.save(usuario);
		} else {
			this.userRep.update(usuario);
		}
		result.redirectTo(this).listar();
	}

	private List<UsuarioCompany> povoaUsuarioCompany(Usuario usuario) {
		List<UsuarioCompany> companies = new ArrayList<UsuarioCompany>();
		for(Empresa e : empresas.getEmpresas()) {
			UsuarioCompany u = new UsuarioCompany();
			u.setCodigoDoUsuario(usuario);
			u.setCodigoExterno(e.getCodigo());
		}
		return companies;
	}
	
	@Post
    @Path("/usuario/ativar/{id}")
	public void ativar(int id) {
		Usuario usuario = this.userRep.load(id);
		if(usuario.isAtivo())
			usuario.setAtivo(false);
		else
			usuario.setAtivo(true);
		this.userRep.update(usuario);
		result.redirectTo(this).listar();
//		result.nothing();
	}
	
	@Post
	@Path("/usuario/addEmpresaTemp/{codigoExterno}")
	public void addEmpresaTemp(int codigoExterno) {
		if(codigoExterno != 0 ) {
			Empresa emp = this.empresaRep.findEmpresaById(codigoExterno);
			this.empresas.getEmpresas().add(emp);
		}
		result.use(Results.json()).withoutRoot().from(empresas.getEmpresas()).serialize();
	}
	
	@Post
	@Path("/usuario/delEmpresaTemp/{codigoExterno}")
	public void delEmpresaTemp(int codigoExterno) {
		if(codigoExterno != 0 ) {
			Empresa emp = this.empresaRep.findEmpresaById(codigoExterno);
			this.empresas.getEmpresas().remove(emp);
		}
		result.nothing();
	}

quando chamo o addEmpresaTemp efetuando o this.empresas.getEmpresas().add(emp); eu adiciono os objetos e talz, e quando vou salvar eu mais uma vez chamo this.empresas.getEmpresas() porem a lista que vem, vem sem objetos ou seja, size 0, toda vez que eu add uma nova empresa eu preciso setar essa lista atualizada na sessao ou o java ja seta pra mim?

4 Respostas

Rafael_Guerreiro

Está anotado com request scoped:

@Component @RequestScoped public class EmpresasWeb {
Ou seja, o vraptor vai criar uma nova instancia para cada requisição que você fizer.
Troque para @SessionScoped.

M

disso eu sei, mais eu estou setando manualmente na session com setAttribute.

preciso que seja request mesmo. é para simular um viewscope, e estou controlando essa sessao, mais nao está recuperando.

Rafael_Guerreiro
O cara está aqui no construtor, você está mexendo em outra intancia.

Eu não setaria manualmente... Pensa melhor no que vc precisa e se essa é a melhor solução...

Se você seta manualmente, você vai precisar usar o HttpSession para capturar essa instancia...

O cara está aqui no construtor, você está mexendo em outra intancia.

Eu não setaria manualmente… Pensa melhor no que vc precisa e se essa é a melhor solução…

Se você seta manualmente, você vai precisar usar o HttpSession para capturar essa instancia…

M

opa, consegui aqui, é porque quando ele estava removendo ele estava procurando por uma referencia que não existia, ou seja, ele estava criando um novo objeto e na hora de remover ele ia comparar com o objeto que tinha dentro da lista e na verdade esse objeto nao tinha porque foi definido uma nova referencia para o novo objeto, ou seja nunca iria remover o mesmo objeto, de forma que na classe Empresa eu implementei o hashcode e o equals e ele passou a remover corretamente.

Rafael, o intuito deu fazer isso é para simular um @viewScope, e está funcionando corretamente agora, e no metodo de salvar quando ele chama o povoaUsuarioCompany estava faltando o companies.add(u) dentro do laço, depois disso está funcionando corretamente, a lista fica “ativa” enquanto a pagina está aberta e é destruida no momento em que eu saio da pagina. (possuo um intercept para controlar essa “vida” dessa lista.)

obrigado mesmo assim.

Criado 23 de maio de 2013
Ultima resposta 23 de mai. de 2013
Respostas 4
Participantes 2