Meu código estava retornando o erro 403, ai vi aqui no forúm como resolvia isso, agora o código está retornando erro 500 e a mensagem UserDetailsService returned null, which is an interface contract violation![]( )
Meu código estava retornando o erro 403, ai vi aqui no forúm como resolvia isso, agora o código está retornando erro 500 e a mensagem UserDetailsService returned null, which is an interface contract violation![]( )
Olá, Antônio! O serviço AutenticacaoService
está retornando null
quando o método loadUserByUsername
é chamado. Isso viola o contrato da interface UserDetailsService
, que espera que um UserDetails
válido seja retornado ou que uma exceção UsernameNotFoundException
seja lançada se o usuário não for encontrado.
Você deve garantir que o método findByLogin
do repositório UsuarioRepository
não retorne null
quando um usuário válido é pesquisado. Se um usuário não for encontrado, você deve lançar uma exceção UsernameNotFoundException
para manter o contrato da interface UserDetailsService
.
Aqui está um exemplo de como você poderia modificar o método loadUserByUsername
para lançar a exceção corretamente:
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return repository.findByLogin(username)
.orElseThrow(() -> new UsernameNotFoundException("Usuário não encontrado com o login: " + username));
}
Neste exemplo, estou usando o método orElseThrow
que é comum em objetos Optional
do Java 8 para lançar a exceção UsernameNotFoundException
se o Optional
for vazio, ou seja, se o usuário não for encontrado.
Ou, se seu findByLogin
estiver retornando direto um UserDetails
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserDetails userDetails = repository.findByLogin(username);
if (userDetails == null) {
throw new UsernameNotFoundException("Usuário não encontrado com o login: " + username)
}
return userDetails;
}