15
respostas

"No entity found for query" no metodo autentica quando tento fazer login


package br.com.caelum.vraptor.controller;

import javax.inject.Inject;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.dao.UsuarioDao;
import br.com.caelum.vraptor.security.Open;
import br.com.caelum.vraptor.security.UsuarioLogado;
import br.com.caelum.vraptor.validator.SimpleMessage;
import br.com.caelum.vraptor.validator.Validator;

@Controller
public class LoginController {

    private UsuarioDao usuarioDao;
    private UsuarioLogado usuarioLogado;
    private Result result;
    private Validator validator;

    public LoginController(){}

    @Inject
    public LoginController(UsuarioDao usuarioDao, UsuarioLogado usuarioLogado, Result result, Validator validator){
        this.usuarioDao = usuarioDao;
        this.usuarioLogado = usuarioLogado;
        this.result = result;
        this.validator = validator;


    }

    @Open
    public void form(){}

    @Open
    public void autentica(String login, String senha){
        Usuario usuario = usuarioDao.busca(login, senha);
        if(usuario != null){
            usuarioLogado.fazLogin(usuario);
            result.redirectTo(UsuarioController.class).lista();
        }else{
            validator.add(new SimpleMessage("login_invalido", "Login ou Senha incorretos "));
            validator.onErrorRedirectTo(this).form();
        }
    }

    @Open
    public void desloga(){
        usuarioLogado.desloga();
        result.redirectTo(this).form();

    }

}
15 respostas

Olá Leonardo,

o cadastro de usuario funcionou normalmente? E me manda o código do seu UsuarioDao para eu dar uma olhada no que pode estar acontecendo.

Eu nao fiz o cadastro na hora que ele explicou no video, aí depois que eu fiz a parte de segurança fiquei sem usuario, aí inseri diretamente no bando de dados..

package br.com.caelum.vraptor.dao;



import java.util.List;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.TypedQuery;

import br.com.caelum.vraptor.controller.Usuario;

@RequestScoped
public class UsuarioDao {

    private EntityManager manager;

    @Inject
    public UsuarioDao(EntityManager manager){
        this.manager = manager;
    }

    public UsuarioDao(){}

    public void adiciona(Usuario usuario){
        manager.getTransaction().begin();
        manager.persist(usuario);
        manager.getTransaction().commit();
    }
    public List<Usuario> lista(){
        TypedQuery<Usuario> query = manager.createQuery("SELECT u FROM Usuario u", Usuario.class);
        return query.getResultList();

    }

    public Usuario busca(String login, String senha) {
        String jpql = "SELECT u FROM Usuario u WHERE u.login = :login AND u.senha = :senha";
        Query query = manager.createQuery(jpql);
        query.setParameter("login", login);
        query.setParameter("senha", senha);

        return (Usuario) query.getSingleResult();
    }
}

Você já tem os códigos para cadastrar o usuário pelo formulário? Serviria para testar se todos os pontos do sistema que usam o UsuarioDao estão apresentando o mesmo problema.

De qualquer forma, como o UsuarioDao está recebendo o EntityManager injetado, provavelmente o problema está no producer ou no xml. Me manda o seu EntityManagerProducer, pom.xml e persistence.xml. Além disso, me manda também toda a stacktrace que ele solta quando explode a exception ao tentar fazer o autentica.

package br.com.caelum.vraptor.infra;

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Disposes;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

@ApplicationScoped
public class EntityManagerProducer {

    private static EntityManagerFactory factory = Persistence.createEntityManagerFactory("default");

    @Produces
    @RequestScoped
    public EntityManager getEntityManager(){
        return factory.createEntityManager();

    }

    public void clese(@Disposes EntityManager manager){
        manager.close();
    }


}
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>your.groupid</groupId>
    <artifactId>alura-horas</artifactId>
    <version>1.0.0</version>
    <packaging>war</packaging>

    <description>A blank project to start using VRaptor 4</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <weld.version>2.1.2.Final</weld.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>br.com.caelum</groupId>
            <artifactId>vraptor</artifactId>
            <version>4.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.jboss.weld.servlet</groupId>
            <artifactId>weld-servlet-core</artifactId>
            <version>2.1.2.Final</version>
        </dependency>

        <dependency>
            <groupId>org.jboss.weld</groupId>
            <artifactId>weld-core-impl</artifactId>
            <version>2.1.2.Final</version>
        </dependency>

        <dependency>
            <groupId>javax.el</groupId>
            <artifactId>el-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
               <groupId>javax.servlet</groupId>
              <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
              <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator-cdi</artifactId>
            <version>5.1.1.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.3.6.Final</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>    

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.33</version>
        </dependency>

        <dependency>
            <groupId>br.com.caelum.vraptor</groupId>
            <artifactId>vraptor-test</artifactId>
            <version>4.1.0-SNAPSHOT</version>
            <scope>test</scope>
        </dependency>

         <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
            <!-- uncomment this line on app servers -->
            <!-- <scope>provided</scope> -->
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>alura-horas</finalName>
        <outputDirectory>c:\Users\Victor\vraptor4\vraptor-blank-project/src/main/webapp/WEB-INF/classes</outputDirectory>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <path>/</path>
                </configuration>
            </plugin>

        </plugins>
    </build>
</project>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">
    <persistence-unit name="default">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/alura_horas" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="root" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

Type Exception Report

Message javax.persistence.NoResultException: No entity found for query

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

javax.servlet.ServletException: javax.persistence.NoResultException: No entity found for query br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:122) Root Cause

javax.persistence.NoResultException: No entity found for query org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:498) br.com.caelum.vraptor.dao.UsuarioDao.busca(UsuarioDao.java:45) br.com.caelum.vraptor.dao.UsuarioDao$Proxy$$$_WeldClientProxy.busca(Unknown Source) br.com.caelum.vraptor.controller.LoginController.autentica(LoginController.java:39) br.com.caelum.vraptor.controller.LoginController$Proxy$$$WeldClientProxy.autentica(Unknown Source) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:498) net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:38) net.vidageek.mirror.invoke.MethodHandlerByMethod.withArgs(MethodHandlerByMethod.java:54) br.com.caelum.vraptor.observer.ExecuteMethod.execute(ExecuteMethod.java:87) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:498) org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:93) org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:266) org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:253) org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:232) org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:169) org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:165) org.jboss.weld.event.ObserverNotifier.notifyObservers(ObserverNotifier.java:119) org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:112) org.jboss.weld.event.EventImpl.fire(EventImpl.java:83) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:78) br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:98) br.com.caelum.vraptor.interceptor.FlashInterceptor$Proxy$$$WeldClientProxy.intercept(Unknown Source) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:58) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:83) br.com.caelum.vraptor.interceptor.AspectStyleInterceptorHandler.execute(AspectStyleInterceptorHandler.java:88) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:83) br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:75) br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor$Proxy$$$WeldClientProxy.intercept(Unknown Source) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:58) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:83) br.com.caelum.vraptor.core.DefaultInterceptorStack.start(DefaultInterceptorStack.java:93) br.com.caelum.vraptor.core.DefaultInterceptorStack$Proxy$$$_WeldClientProxy.start(Unknown Source) br.com.caelum.vraptor.observer.RequestHandlerObserver.handle(RequestHandlerObserver.java:93) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:498) org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:93) org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:266) org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:253) org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:232) org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:169) org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:165) org.jboss.weld.event.ObserverNotifier.notifyObservers(ObserverNotifier.java:119) org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:112) org.jboss.weld.event.EventImpl.fire(EventImpl.java:83) br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:118)

Olhando sua exception na vedade ele deu erro na hora de executar o método query.getSingleResult():

org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:498) 
br.com.caelum.vraptor.dao.UsuarioDao.busca(UsuarioDao.java:45)

ou seja, ele consegue criar a conexão com o banco e chega a fazer a consulta, porém ele não encontra o usuário cadastrado. Pode ser que os parâmetros de login e senha do autentica do LoginController não estejam sendo preenchidos ou estejam com valores diferentes do que está no banco. Você pode executar em modo debug ou até um System.out.println para descobrir quais valores estão vindo nestes parâmetros e ver se batem com o usuário cadastrado.

Lucas está certo, sempre que utilizar o getSingleResult, coloque o bloco em um try-catch e capture a exceção de NoResultException, que em caso de não encontrar um usuário voce podera trata-la e fazer com quem chame essa função faça o mesmo, ficando da seguinte forma.

try { Usuario usuarioBuscado = query.getSingleResult(); return usuarioBuscado; } catch (NoResultException ex) { throw new Exception("Usuário não encontrado!"); }

Estou tendo o mesmo problema e não consegui resolver. Ainda aparece que o erro para a minha query. Fiz essa parte do Try, porem, agora ele simplesmente não loga. Consigo cadastrar os usuarios, mas não consigo logar.

De que forma eu consigo dar um system.out.println para ver os resultados da minha busca?

Olá Victor,

manda o código do controller e do dao para eu dar uma olhada.

Do System.out.println só colocar no método autentica antes de fazer a chamada para o busca. Pede para ele imprimir o login e a senha que você recebe como parâmetro.

Seguem os dois. Login Controller

package br.unemat.digera.controllers;

import javax.inject.Inject;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.validator.SimpleMessage;
import br.com.caelum.vraptor.validator.Validator;
import br.unemat.digera.dao.UsuarioDao;
import br.unemat.digera.modelos.Usuario;
import br.unemat.digera.seguranca.Open;
import br.unemat.digera.seguranca.UsuarioLogado;

@Controller
public class LoginController {

    private UsuarioDao usuarioDao;
    private UsuarioLogado usuarioLogado;
    private Result result;
    private Validator validator;

    public LoginController(){}
    @Inject
    public LoginController(UsuarioDao usuarioDao, UsuarioLogado usuarioLogado,
            Result result, Validator validator){
        this.usuarioDao = usuarioDao;
        this.usuarioLogado = usuarioLogado;
        this.result = result;
        this.validator = validator;        
    }

    @Open
    public void form(){}

    @Open
    public void autentica(String login, String senha){

        System.out.printf("login: ", login);
        System.out.printf("senha: ", senha);

        Usuario usuario = usuarioDao.busca(login, senha);


        if(usuario != null){
            usuarioLogado.fazLogin(usuario);
            result.redirectTo(UsuarioController.class).lista();
        }else{
            validator.add(new SimpleMessage("login_invalido",
                    "Login ou senha incorretos"));
            validator.onErrorRedirectTo(this).form();
        }    
    }

    @Open
    public void desloga(){
        usuarioLogado.desloga();
        result.redirectTo(this).form();
    }
}

Usuario Dao

package br.unemat.digera.dao;

import java.util.List;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.TypedQuery;

import br.unemat.digera.modelos.Usuario;

@RequestScoped
public class UsuarioDao {

    private EntityManager manager;

    @Inject
    public UsuarioDao(EntityManager manager){
        this.manager = manager;
    }

    public UsuarioDao(){}

    public void adiciona(Usuario usuario){
        manager.getTransaction().begin();
        manager.persist(usuario);
        manager.getTransaction().commit();
    }

    public List<Usuario> lista(){
        TypedQuery<Usuario> query = manager.createQuery("select u from Usuario u", Usuario.class);
        return query.getResultList();
    }

    public Usuario busca(String login, String senha) {
        TypedQuery<Usuario> query = manager.createQuery("select u from Usuario u where u.login = :login and u.senha = :senha", Usuario.class);        
        query.setParameter("login", login);
        query.setParameter("senha", senha);

        try{
            return query.getSingleResult();
        }catch(NoResultException e){
            e.printStackTrace();
            return null;
        }

    }
}

E verifiquei o meu println e eles estão como nulos.

Pelo que percebi, meu form.jsp não está enviando os parametros de login e senha.

segue o codigo do form

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib tagdir="/WEB-INF/tags" prefix="erro"%>

<%@ include file="/WEB-INF/jsp/header.jsp"%>

<div class="container">

    <form action="${linkTo[LoginController].autentica(null, null)}"
        method="post" class="form-signin">

        <erro:validationMessage name="login_invalido"></erro:validationMessage>

        <h2 class="form-signin-heading">Sistema DIGERA</h2>

        <label for="usuario"> </label> <input
            type="text" name="usuario" id="usuario" class="form-control"
            placeholder="Usuario" required="required"/>

         <label    for="senha"> </label> <input
            type="password" name="senha" id="senha" class="form-control"
            placeholder="Senha" required="required"/>

        <input type="submit" value="Entrar" class="btn btn-lg btn-success btn-block"/>

    </form>

</div>

<%@ include file="/WEB-INF/jsp/footer.jsp"%>

Olá Victor,

parece que na verdade o o parâmetro de login não está indo. Note que no controller o método autentica espera que venha um parâmetro na requisição chamado de login:

@Open
public void autentica(String login, String senha){
    ...
}

Só que na jsp o name do input não está login para o controller conseguir receber a informação, está como usuario:

<input type="text" name="usuario" id="usuario" class="form-control" placeholder="Usuario" required="required"/>

Então ele não deve estar conseguindo logar porque a informação de qual é o login não está chegando para o controller.

Como diria o Chaves: "Que burrooo, dá zero pra ele" kkkkkkkkk Obrigado. Funcionou agora