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.