Aplicação não funciona com autenticação de usuário no VRaptor3 [Resolvido]

Olá pessoal!

Minha aplicação estava funcionando até eu criar o recurso de login de usuário seguindo a apostila da Caelum, acontece que eu tenho uma página principal index.jsp que não está sendo mais chamada como antes, este é o erro ao rodar a aplicação:

HTTP STATUS 500

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

br.com.caelum.vraptor.http.route.RouteNotFoundException: The selected route is invalid for redirection: br.com.bruno.jmovie.controller.LoginController.loginUsuario
	br.com.caelum.vraptor.http.route.DefaultRouter.urlFor(DefaultRouter.java:155)
	br.com.caelum.vraptor.view.DefaultLogicResult$2.intercept(DefaultLogicResult.java:106)
	br.com.caelum.vraptor.proxy.AbstractCglibProxifier$2.intercept(AbstractCglibProxifier.java:38)
	br.com.bruno.jmovie.controller.LoginController$$EnhancerByCGLIB$$34f09898.loginUsuario(<generated>)
	br.com.bruno.jmovie.interceptor.LoginInterceptor.intercept(LoginInterceptor.java:32)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.18 logs.

Esta é a minha classe LoginController:

@Controller
public class LoginController {
	
	private UsuarioDAO usuarioDao;
	private UsuarioLogado usuarioLogado;
	private Result result;
	
	
	public LoginController(UsuarioDAO usuarioDao, UsuarioLogado usuarioLogado, Result result){
	    this.usuarioDao = usuarioDao;
	    this.usuarioLogado = usuarioLogado;
	    this.result = result;
	}
	
	public void autentica(Usuario usuario) {
	    Usuario autenticado = usuarioDao.buscaUsuarioPorLoginESenha(usuario);
	    if(autenticado != null) {
	        usuarioLogado.efetuaLogin(autenticado);
	        result.use(Results.logic()).redirectTo(FilmeController.class).lista();
	        return;
	    }
	    result.use(Results.logic()).redirectTo(LoginController.class).loginUsuario();
	}
	
	
	public void loginUsuario() {
		
	}
}

Minha classe LoginInterceptor:

@Intercepts
public class LoginInterceptor implements Interceptor {
	
	private UsuarioLogado usuarioLogado;
	private Result result;
	
	
	public LoginInterceptor(UsuarioLogado usuarioLogado, Result result) {
	    this.usuarioLogado = usuarioLogado;
	    this.result = result;
	}
	
	
	public void intercept(InterceptorStack stack, ResourceMethod method, Object instance)
	                    throws InterceptionException {
	    if(usuarioLogado.getUsuario() != null) {
	        stack.next(method, instance);
	    } else {
	        result.use(Results.logic()).redirectTo(LoginController.class).loginUsuario();
	    }
	}
	
	
	public boolean accepts(ResourceMethod method) {
	    ResourceClass resource = method.getResource();
	    return !resource.getType().isAssignableFrom(LoginController.class);
	}		
}

Meu UsuarioDAO:

@Component
@RequestScoped
public class UsuarioDAO {
	
	private Session session;
	
	public UsuarioDAO() {
	    this.session = new HibernateUtil().getSession();
	}
	
	public void adiciona(Usuario usuario) {
		Transaction tx = session.beginTransaction();
		session.save(usuario);
		tx.commit();
	}
	
	
	public Usuario buscaUsuarioPorLoginESenha(Usuario usuario) {
	    Query query = this.session.
	    createQuery("from Usuario where login = :pLogin and senha = :pSenha");
	    query.setParameter("pLogin", usuario.getLogin());
	    query.setParameter("pSenha", usuario.getSenha());
	    return (Usuario) query.uniqueResult();
	}
}

Minha classe UsuarioLogado:

@Component
@SessionScoped
public class UsuarioLogado {
	     private Usuario usuarioLogado;
	     
	     public void efetuaLogin(Usuario usuario) {
	         this.usuarioLogado = usuario;
	     }
	     public Usuario getUsuario() {
	         return this.usuarioLogado;
	     }
}

Já criei a tabela Usuario no banco sem inserir nenhum usuário, o que eu queria é abrir a aplicação na página Index.jsp e somente quando clicar no link “Login” no menú, que fosse redirecionado para o LoginUsuario.jsp e ai sim que funcionasse o recurso de Login com autenticação.

Grato pela atenção!

Abraço!

troca o @Controller por @Resource (br.com.caelum.vraptor)
no LoginController

[]'a

Fiz isso Lucas, o erro aumentou:

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'loginController' defined in file [/home/bruno/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/JMovie/WEB-INF/classes/br/com/bruno/jmovie/controller/LoginController.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [br.com.bruno.jmovie.dao.UsuarioDAO]: : Error creating bean with name 'usuarioDAO' defined in file [/home/bruno/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/JMovie/WEB-INF/classes/br/com/bruno/jmovie/dao/UsuarioDAO.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.bruno.jmovie.dao.UsuarioDAO]: Constructor threw exception; nested exception is java.lang.StackOverflowError; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'usuarioDAO' defined in file [/home/bruno/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/JMovie/WEB-INF/classes/br/com/bruno/jmovie/dao/UsuarioDAO.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.bruno.jmovie.dao.UsuarioDAO]: Constructor threw exception; nested exception is java.lang.StackOverflowError
	org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:698)
	org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:192)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:984)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:886)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
	org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:328)
	org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:385)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:375)
	org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1069)
	org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:221)
	br.com.caelum.vraptor.ioc.spring.VRaptorApplicationContext.getBean(VRaptorApplicationContext.java:240)
	br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:58)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:41)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)

root cause

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'usuarioDAO' defined in file [/home/bruno/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/JMovie/WEB-INF/classes/br/com/bruno/jmovie/dao/UsuarioDAO.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.bruno.jmovie.dao.UsuarioDAO]: Constructor threw exception; nested exception is java.lang.StackOverflowError
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:946)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:890)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
	org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:328)
	org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:820)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:762)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:680)
	org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:771)
	org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:691)
	org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:192)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:984)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:886)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
	org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:328)
	org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:385)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:375)
	org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1069)
	org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:221)
	br.com.caelum.vraptor.ioc.spring.VRaptorApplicationContext.getBean(VRaptorApplicationContext.java:240)
	br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:58)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:41)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
root cause

java.lang.StackOverflowError
	br.com.bruno.jmovie.dao.HibernateUtil.getSession(HibernateUtil.java:28)

Estranho é que a pagina loginUsuario.jsp existe e esta dentro da pasta /jsp/login, mas por algum motivo ele não redireciona para a minha index.jsp.

no construtor do seu dao:

 this.session = new HibernateUtil().getSession();  

deve estar dando algum loop infinito… tenta ver se tem algo errado nessa chamada

Já estava lá:

@Component
@RequestScoped
public class UsuarioDAO {
	
	private Session session;
	
	public UsuarioDAO() {
	    this.session = new HibernateUtil().getSession();
	}
	
	public void adiciona(Usuario usuario) {
		Transaction tx = session.beginTransaction();
		session.save(usuario);
		tx.commit();
	}
	
	
	public Usuario buscaUsuarioPorLoginESenha(Usuario usuario) {
	    Query query = this.session.
	    createQuery("from Usuario where login = :pLogin and senha = :pSenha");
	    query.setParameter("pLogin", usuario.getLogin());
	    query.setParameter("pSenha", usuario.getSenha());
	    return (Usuario) query.uniqueResult();
	}
}

Não sei se vai esclarecer alguma coisa, mas se eu digitar no browser o endereço http://localhost:8085/JMovie/filme/lista ou http://localhost:8085/JMovie/filme/adiciona sou redirecionado para o endereço http://localhost:8085/JMovie/login/loginUsuario com o erro que eu postei, ou seja, o Interceptor está funcionando, mas esta zicando a aplicação toda, pq quando eu digitava http://localhost:8085/JMovie eu ia para a index.jsp.

Valeu!

tenta mudar o accepts do interceptor

 public boolean accepts(ResourceMethod method) {  
         ResourceClass resource = method.getResource();  
         return !LoginController.class.isAssignableFrom(resource.getType()); 
  }

comenta a linha this.session = new HibernateUtil().getSession(); do seu Dao, e se fizer a requisição normalmente (provavelmente vai dar um null pointer, mas tudo bem) posta o código do seu HibernateUtil aqui, pode ter algo errado nele

Deu certo Lucas!
Está indo para a página de Login, mas como faço para redirecionar para a index.jsp? Pq é a index a página principal, lá têm o menú para cadastrar usuario e fazer Login. Preciso cair na Index para cadastrar usuario e depois fazer Login…

Abraço!

Este é o meu HibernateUtil:

public class HibernateUtil {
	
	private static final SessionFactory sessionFactory;

	static {

		AnnotationConfiguration configuration = new AnnotationConfiguration();
		configuration.addAnnotatedClass(Filme.class);
		configuration.addAnnotatedClass(Usuario.class);
		sessionFactory = configuration.buildSessionFactory();
		 new SchemaExport(configuration).create(false, false);

	}
	
	public static Session openSession() {
		return sessionFactory.openSession();
	}
	
	public Session getSession() {
		return getSession();
	}

}

Coloquei “false” para não deletar td e depois recriar as tabelas.

você pode, no interceptor, trocar o

result.use(Results.logic()).redirectTo(LoginController.class).loginUsuario();

por

result.redirectTo(HomeController.class).index();

e nesse HomeController colocar

@Resource
public class HomeController {
    @Path("/")
    public void index() {
        result.forwardTo("/caminho/para/o/index.jsp");
    }
}

ou simplesmente copiar o seu index.jsp pra pasta WEB-INF/jsp/home.

não se esqueça de adicionar o HomeController ao seu controle de acesso, mudando o accepts do seu interceptor:

    public boolean accepts(ResourceMethod method) {    
            ResourceClass resource = method.getResource();    
            return !LoginController.class.isAssignableFrom(resource.getType()) && !HomeController.class.isAssignableFrom(resource.getType());   
    }  

essas solução um pouquinho maior é pra vc não linkar diretamente pro jsp, mas dá pra fazer isso se vc quiser

Não deu certo, ele não direciona para a minha index.jsp, assim está o meu Interceptor:

@Intercepts
public class LoginInterceptor implements Interceptor {
	
	private UsuarioLogado usuarioLogado;
	private Result result;	
	
	public LoginInterceptor(UsuarioLogado usuarioLogado, Result result) {
	    this.usuarioLogado = usuarioLogado;
	    this.result = result;
	}	
	
	public void intercept(InterceptorStack stack, ResourceMethod method, Object instance)
	                    throws InterceptionException {
	    if(usuarioLogado.getUsuario() != null) {
	        stack.next(method, instance);
	    } else {
	          	result.redirectTo(IndexController.class).index(); 
	    }	    
    }
	
	
	
	public boolean accepts(ResourceMethod method) {
	    ResourceClass resource = method.getResource();
	    return !LoginController.class.isAssignableFrom(resource.getType()) && !IndexController.class.isAssignableFrom(resource.getType());  
	  	    
    }	
	
}

Meu IndexController :

@Controller
public class IndexController {
	
	private final Result result;

	public IndexController(Result result) {
		this.result = result;
	}
	@Path("/index")	
	public void index() {
		result.forwardTo("/index.jsp");  
	}
	
}

Já tentei vários caminhos possiveis no result.forward e no @Path, o erro é o mesmo:

br.com.caelum.vraptor.http.route.RouteNotFoundException: The selected route is invalid for redirection: br.com.bruno.jmovie.controller.IndexController.index

A árvore do projeto está assim:

Fiz uma alteração na classe IndexController, ao invés de anotá-la como Controller, coloquei Resource:

@Resource
public class IndexController {
	@Path("/index")	
	public void index() {
		
	}	
}

Agora a aplicação está indo para a página Index.

Lucas, têm alguma coisa errada na apostila, na página 175 diz que a anotação do LoginController é Controller e na página 177 a classe está com anotação Resource, eu consegui aqui com Resource, mas parece que deveria ser Controller, poderia confirmar qual é anotação certa?
Tô seguindo a apostila caelum-java-web-fj21.

Valeu!

a anotação correta é @Resource

Obrigado pela força Lucas! =)
Era isso que tava zicando aqui, anotação errada.
Abraço!