Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Login @ManyToOne com erro de cannot be cast to class java.util.Collection

Fiz o login como @ManyToOne na entidade Perfil, que no meu projeto chamei de nível, e agora esta dando esse erro

Erro:

java.lang.ClassCastException: class br.com.example.model.Nivel cannot be cast to class java.util.Collection (br.com.example.Nivel is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @3dd3a235; java.util.Collection is in module java.base of loader 'bootstrap')
    at br.com.example.model.Login.getAuthorities(Login.java:61) ~[classes/:na]
    at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.createSuccessAuthentication(AbstractUserDetailsAuthenticationProvider.java:197) ~[spring-security-core-5.5.3.jar:5.5.3]
    at org.springframework.security.authentication.dao.DaoAuthenticationProvider.createSuccessAuthentication(DaoAuthenticationProvider.java:122) ~[spring-security-core-5.5.3.jar:5.5.3]
    at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:168) ~[spring-security-core-5.5.3.jar:5.5.3]
    at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:182) ~[spring-security-core-5.5.3.jar:5.5.3]
    at br.com.example.controller.AutenticacaoController.autenticar(AutenticacaoController.java:36) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]

Login:


       @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "login_id")
    private Long id;
    private String login;
    private String senha;   

   @ManyToOne
    @JoinColumn(name = "nivel_id")
    private Nivel nivel;

    //Getters and Setters

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

Nivel:

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "nivel_id")
    private int id;

    @Column(name = "nome_nivel")
    private String nome;

    //Getters and Setters

    @Override
    public String getAuthority() {
        return this.nome;
    }
4 respostas

Oi Gabriela,

O erro acontece porque para o Spring o perfil precisar ser uma lista.

Altere seu atributo nível para:

@ManyToMany
@JoinTable(name = "login_niveis", 
        joinColumns = @JoinColumn(name = "login_id"), 
        inverseJoinColumns = @JoinColumn(name = "nivel_id"))
private List<Nivel> nivel;

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

Mas nesse caso eu estou chamando uma tabela que não existe a "login_niveis" o relacionamento é @ManyToOne porque um login só pode ter um nível

solução!

Se não der para ter essa nova tabela de join com uma lista de niveis, da pra fazer um "ajuste" no seu código para criar uma lista contendo apenas um único nivel:

@ManyToOne
@JoinColumn(name = "nivel_id")
private Nivel nivel;

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

Assim deu certo prof, muito obrigada!