Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
11
respostas

Problema em query no banco - login?error

Prezados, estou com problema ao tentar efetura login, que so retorna por parametro da seguinte forma: login?error

Estou utilizando o PostGre.

Com isso, no meu banco a tabela User é composta por colunas (email-PK, name, password). Debugando, descobri que o codigo para na query, mas não é lançando nenhuma exception do tipo "nao encontrado tabela x", "nao encontrado coluna x" ... Simplesmente ele printa o resultado que é:

Hibernate: select user0_.email as email1_3_, user0_.name as name2_3_, user0_.password as password3_3_ from User user0_ where user0_.email=?

Hibernate: select user0_.email as email1_3_, user0_.name as name2_3_, user0_.password as password3_3_ from User user0_ where user0_.email=?

Hibernate: select user0_.email as email1_3_, user0_.name as name2_3_, user0_.password as password3_3_ from User user0_ where user0_.email=?

neste caso, três tentativas de login.

Meu palpite é que tenha algo errado com o banco, ou a forma em que ele foi montado, então veja no link abaixo as imagens que demonstram minhas tabelas e sua estrutura: https://drive.google.com/drive/folders/1cujvAC1JhHDEL00UslQarCXV9L2hmiye?usp=sharing

Ainda, a classe onde a Query está sendo realziada:

@Repository
public class UserDAO implements UserDetailsService {

    @PersistenceContext
    private EntityManager manager;

    @Override
    public User loadUserByUsername(String email) {
        System.out.println();

        List <User> users = 
                manager.createQuery("select u from User u where email = :email", User.class)
                .setParameter("email", email).getResultList();

        if(users.isEmpty()) {
            throw new UsernameNotFoundException("Usuario " + email + "não foi encontrado no sistema");
        }
        System.out.println();
        return users.get(0);
    }
}

Tambem, segue o codigo das Entidades:

@Entity
public class User implements UserDetails {

    private static final long serialVersionUID = 1L;

    @Id
    private String email;
    private String name;
    private String password;


    @OneToMany(fetch=FetchType.EAGER)
    private List<Role> roles = new ArrayList<>();

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return this.roles;
    }

    @Override
    public String getPassword() {
        // TODO Auto-generated method stub
        return this.password;
    }

    @Override
    public String getUsername() {
        // TODO Auto-generated method stub
        return this.email;
    }

    @Override
    public boolean isAccountNonExpired() {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public boolean isEnabled() {
        // TODO Auto-generated method stub
        return true;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }
}
@Entity
public class Role implements GrantedAuthority{

    private static final long serialVersionUID = 1L;

    @Id
    private String name;

    @Override
    public String getAuthority() {
        return this.name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

Por favor, me ajudem. Estou aguarrado a dias neste ponto e não consigo resolver.

11 respostas

Acho que é porque você não passou o alias no atributo email, tente dessa forma:

select u from User u where u.email = :email

Opa Bruno obrigado pela contribuição. Então, tentei a principio com o alias mas também não funciona. Na atividade e no video, está referenciando sem o alias. Nao estou conseguindo entender o porque nao funciona.

Não da nenhuma exception? Ou será que vc só não está capturando-as?

Então, eu estou capturando para caso o retorno é vazio. Mas se caso estivesse errado, o código deveria estar crashando quando passa se nessa parte não?

Pode estar abafando a exception dentro de um try/catch por ex.

mas quando se usa uma exception é para que o fluxo continue com o tratamento, para que o codigo nao pare do nada certo? se estivesse com erro, nao seria tratado pois apenas tratei para retorno vazio, mas o codigo quebraria no ponto do erro, algo que nao acontece. Então, nao entedi bem como seria abar com a exception.

Outro detalhe, limpei o banco e as tabelas que deveria ser criadas, não foram. Como: User, Role e User_Role.

Para as outras tabelas foram criadas, normalmente. Seria alguma outra configuração a fazer? O Hibernate cria as tabelas com base nas entidades, conforme encontra as Anotations Entity, certo?

O hibernate cria, mas depende de uma configuração ("hibernate.auto", algo assim) no persistence.xml

Sobre a exception, a questão é que você poderia ter colocado um try/catch no código que chama o seu método de persistência (onde pode estar ocorrendo o erro), com isso, acaba suprimindo a mensagem caso não esteja propagando no catch

Então bruno, em minhas classes anotadas com @Entity representam uma tabela, que não está sendo criada para User e Role.

Sobre a exception, apliquei o try/catch como orientou, ai ele cai no catch mas como base no que eu for tratar certo? quero dizer, poderia colocar a exception (resposta) que quiser. O hibernate, nao me reporta nada se houve algum problema como, "olha a tabela nao existe", "nao conectei no banco" simplesmente o console é este:

Hibernate: select user0_.email as email1_3_, user0_.name as name2_3_, user0_.password as password3_3_ from User user0_ where user0_.email=?

Hibernate: select user0_.email as email1_3_, user0_.name as name2_3_, user0_.password as password3_3_ from User user0_ where user0_.email=?

obrigado bruno pela ajuda!

solução!

A solução foi que "user" é uma palavra reservada pelo postgree e minha entidade estava denominada de user. Desta forma, tive que renomear a entidade pois somente a anotation @table, não resolveu o meu problema.

Obrigado pela ajuda @Bruno!