1
resposta

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![](Insira aqui a descrição dessa imagem para ajudar na acessibilidade )

1 resposta

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