1
resposta

3. Autenticação e Autorização

Recentemente estava passando por um problema na lógica da "autenticação e Autorização" Caso alguém esteja passando por isso esse tópico vai te ajudar.

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.controle.horas.daos.UsuarioDao.busca(UsuarioDao.java:51)

Código UsuarioDao

public Usuario busca(String login, String senha) {
        TypedQuery<Usuario> query = this.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);

/*Aqui está levantando a exceção "NoResultException" 
quando digitamos usuários ou senhas erradas */
        return query.getSingleResult();

    }

A solução que encontrei para continuar a utilizar "getSingleResult();" foi fazer o tratamento com Try e Catch segue o código abaixo corrigido na classe "UsuarioDao"

public Usuario busca(String login, String senha) {
        TypedQuery<Usuario> query = this.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;
        }

    }

/*LoginController*/
/**Codigo omisso**/

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

Com essa solução no UsuarioDao o método autentica do LoginController pode me retornar "Login ou senha incorretos." :) Espero ter ajudado. Bons Estudos.

1 resposta

Opa, valeu por compartilhar. Outra estratégia é você usar um getResultList(), verificar se tem 1 elemento e aí acessa ele. A vantagem é que vc não precisa lançar uma exception para tratar o usuário inválido.