Caelum fj21: exercícios: Construindo a autenticação e a autorização

Boa tarde, galera!

Estou estudando em cima da apostila caelum fj21, to com dificuldade aqui, se alguém puder dar uma força…

class LoginController:

@Resource
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.redirectTo(ProdutoController.class).lista();
            return;
        }
        result.redirectTo(LoginController.class).formulario();
    }

    public void formulario() {
    }
}

UsuarioDAO:

@Component
@RequestScoped
public class UsuarioDAO {

    private Session session;

    public UsuarioDAO() {
        this.session = new HibernateUtil().getSession();
    }

    public Usuario buscaUsuarioPorLoginESenha(Usuario usuario) {
        Query query = this.session.createQuery("from caelum.VRaptor.modelo.Usuario where login = :pLogin and senha = :pSenha");
        query.setParameter("pLogin", usuario.getLogin());
        query.setParameter("pSenha", usuario.getSenha());
        return (Usuario) query.uniqueResult();
    }
}

Usuario:


@Entity
@PersistenceContext

public class Usuario implements Serializable{
    @Id
    @GeneratedValue
    @Column(name="id")
    private int id;
    @Column(name="nome")
    private String nome;
    @Column(name="login")
    private String login;
    @Column(name="senha")
    private String senha;

    public int getId() {
        return id;
    }

    public String getLogin() {
        return login;
    }

    public String getNome() {
        return nome;
    }

    public String getSenha() {
        return senha;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }
}

Exception:

07/09/2010 13:57:29 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet default threw exception
br.com.caelum.vraptor.InterceptionException: an exception was raised while executing resource method
        at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:86)
        at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
        at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
        at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
        at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
        at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:86)
        at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
        at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
        at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
        at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
        at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
        at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
        at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
        at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
        at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
        at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
        at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
        at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
        at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
        at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
        at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
        at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
        at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
        at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
        at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
        at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:861)
        at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
        at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1584)
        at java.lang.Thread.run(Thread.java:619)
Caused by: org.hibernate.QueryParameterException: could not locate named parameter [pLogin]
        at org.hibernate.engine.query.ParameterMetadata.getNamedParameterDescriptor(ParameterMetadata.java:101)
        at org.hibernate.engine.query.ParameterMetadata.getNamedParameterExpectedType(ParameterMetadata.java:107)
        at org.hibernate.impl.AbstractQueryImpl.determineType(AbstractQueryImpl.java:461)
        at org.hibernate.impl.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:431)
        at caelum.VRaptor.dao.UsuarioDAO.buscaUsuarioPorLoginESenha(UsuarioDAO.java:21)
        at caelum.VRaptor.controllers.LoginController.autentica(LoginController.java:31)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
        ... 37 more

Peço desculpas ao moderador, se fiz algo errado, 1ª vez.

O problema está neste trecho, eu acho:

Query query = this.session.createQuery("from caelum.VRaptor.modelo.Usuario where login = :pLogin and senha = :pSenha");
        query.setParameter("pLogin", usuario.getLogin());

Eu, infelizmente, ao contrário dos outros exercicios, não consegui encontrar uma solução para esse aqui! Minha dúvida é saber como fazer o setPatameter aceitar o dado que estou passando, no caso o pLogin.

Agradeço desde já. :smiley:

Abraço!

Se vc possui uma Classe Usuario, a query fica assim:

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();
	}	

Veja se funciona.

Valeu Pela força, Guevara!

Eu coloquei assim:

Query query = this.session.createQuery("from caelum.VRaptor.modelo.Usuario where login = :pLogin and senha = :pSenha"); 

Por que assim:

createQuery("from Usuario where login = :pLogin and senha = :pSenha");

Dá essa Exception:

Caused by: org.hibernate.hql.ast.QuerySyntaxException: Usuario is not mapped [from Usuario where login = :pLogin and senha = :pSenha]

Ele pede para mapear, mas agradeço, Guevara!

Vc esqueceu de mapear a classe Usuario no seu HibernateUtil?

public class HibernateUtil {

	private static SessionFactory factory;

	static {
		AnnotationConfiguration cfg = new AnnotationConfiguration();
		cfg.addAnnotatedClass(Usuario.class);
cfg.addAnnotatedClass(OutraClasse.class);
		
	}

	public Session getSession() {
		return factory.openSession();
	}
}

[RESOLVIDO]

Viva Guevara!

Era justamente isso!

Funcionou perfeitamente, fica com deus, irmão!

Abraço! :smiley: