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

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

[code]@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;
}

}[/code]

e estou usando isso no meu controller Usuario

[code]
@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();
}[/code]

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?

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.

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.

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…

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.