[Resolvido]Session Request fica null e não seta nada

Amigos estou aprendendo o VRaptor mas têm alguns detalhes que não sei o porque fica dando pau.

Segue as duas classes de exemplo é o erro:

1º problema é que o request.setAttribute não esta setando o valor na sessão.

2° é que hora sim hora não o request em UsuárioController esta indo como nulo. Para resolver só reiniciando o apache.

Detalhe: Apache TomCat 7.22.

Desde já agradeço a ajuda de vocês.

LoginController.java

package br.com.filesystem.controller;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.ioc.SessionScoped;
import br.com.filesystem.dao.UsuarioDao;
import br.com.filesystem.entities.Usuario;

/**
 * @author Destroyer
 * 
 */

@Resource
@SessionScoped
public class LoginController{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private final Result result;
	private UsuarioDao<Usuario> dao;
	private final Logger logger = Logger.getLogger(this.getClass());
	HttpServletRequest request;

	public LoginController(HttpServletRequest request, Result result, UsuarioDao<Usuario> dao) {
		this.result = result;
		this.dao = dao;
		this.request = request;
	}

	@Path("/")
	public void index() {

	}

	public void login(Usuario usuario) {			
		try {
			if (dao.restoreAll(usuario) != null && dao.restoreAll(usuario).isEmpty()) {
				// save 1 usuário
				if(usuario != null){
					if(usuario.getUsrLogin().equalsIgnoreCase("admin") && usuario.getUsrSenha().equalsIgnoreCase("1")){
						usuario.setUsrNome("Administrador");
						dao.save(usuario, 1);
						request.setAttribute("usuario", usuario);
						result.redirectTo(UsuarioController.class).usuario();
					}else{
						result.include("msg", "Login ou senha ivalidos!");
						result.redirectTo(this).index();
					}
				}
			} else {
				// busca o usuario
				usuario = dao.getLoginSenha(usuario);
				logger.info("Usuario-->" + usuario);
				if(usuario != null){
					logger.info("Usuario 2-->" + usuario);
					request.setAttribute("usuario", usuario);
					logger.info("Request-->" + request);
					result.redirectTo(UsuarioController.class).usuario();					
				}else{
					result.include("msg", "Login ou senha ivalidos!");
					result.redirectTo(this).index();
				}
			}
		} catch (Exception e) {
			logger.error("Erro ao logar!", e);
		}
	}

	@Path("/logoff")
	public void logoff() {
		request.setAttribute("usuario", null);
		result.redirectTo(this).index();
	}

}

UsuarioController.java

package br.com.filesystem.controller;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.ioc.RequestScoped;
import br.com.filesystem.dao.UsuarioDao;
import br.com.filesystem.entities.Usuario;

@Resource
@RequestScoped
public class UsuarioController{

	private final Result result;
	private final Logger logger = Logger.getLogger(this.getClass());
	private UsuarioDao<Usuario> dao;
	private HttpServletRequest request;
	
	public UsuarioController(HttpServletRequest request, Result result, UsuarioDao<Usuario> dao) {
		this.result = result;
		this.dao = dao;		
		this.request = request; 
	}
	@Path("/usuario/usuario")
	public void usuario(){
		logger.info("Request 2 " + request.getAttribute("usr"));
		result.include("msg", request);
		
	}
	
	public void salvar(Usuario usuario){
		try{
			
			if(usuario != null){
				if(usuario.getUsrId() == null){
					dao.save(usuario, null);
				}else{
					dao.update(usuario, null);
				}
			}
		}catch(Exception e){
			logger.error("Erro ao salvar usuário." + usuario, e);
		}
		result.include("msg", usuario);
		result.forwardTo(this.getClass()).usuario();
	}
	
}

pra colocar uma variável na Session você deve fazer o seguinte

Agora tem esse link aki do Washington Botelho pra te ajudar http://wbotelhos.com.br/2010/04/07/controle-de-login-com-vraptor-3

O problema é que o seu LoginController está anotado com @SessionScoped, ou seja, ele só vai carregar as dependências no primeiro acesso de cada usuário.

O ideal é que você remova essas anotações (deixando todo mundo como @RequestScoped).

Assim o VRaptor vai te entregar o ‘request’ a cada request feito pelo usuário.

cleisommais, oque o amigo acima falou faz todo o sentido.

Atente que é importante entender os escopos dos componentes, deixar o Controller com escopo de sessão não faz muito sentido.

Deixar a classe Usuario nesse escopo também não. Eu criaria uma classe UsuarioSessao, e faria um controller para “logar” o usuario, ou seja, coloca-lo na sessao, depois é soh receber esse UsuarioSessao nos seus outros controllers, segue um exemplo:

public class UsuarioSessao {
   private Usuario usuario;

   // construtores, getters e setters necessarios
}

Controller de login:

@Resource
public class LoginController {
   private UsuarioSessao usuarioSessao;

   public LoginController(UsuarioSessao usuarioSessao, outras dependencias) {
      this.usuarioSessao = usuarioSessao;
   }

   @Post
   public void loga(Usuario usuario) {
      usuario = dao.encontraUsuario(usuario);
      if(usuario != null) {
         usuarioSessao.setUsuario(usuario);
      }
   }
}

pronto, caso seu dao retorne o usuário, ele já está na sessão.

Agora utilizando o user que está na sessão

public class QualquerController {
  
   UsuarioSessao usuarioSessao;

   public QualquerController(UsuarioSessao usuarioSessao) {
      this.usuarioSessao = usuarioSessao;
   }

   @Get("/url")
   public void usaUsuario() {
      System.out.println(usuarioSessao.getUsuario().getNome());
   }
}

abrasssss

Galera,
Eu vacilei no setParameter. hehehe :oops: Estou rindo aqui sozinho devido a vacilada.

Sobre os detalhes que o Renan falou é muito válido.

Vou alterar aqui tudo.

Mais tarde eu reporto o ocorrido e se tiver tudo ok vou colocar como resolvido o post.

é valido sim, principalmente por vc nao ter de trabalhar com api nativa de Request. No caso exposto é desnecessário.

abrasssss