3
respostas

[Dúvida] Exceção para token inválido

Na minha classe TokenService estou lançando o erro TokenInvalidoException:

} catch (JWTVerificationException exception) {
            throw new TokenInvalidoException("Token JWT inválido ou expirado!");
        }

E no meu Handler de erros eu coloquei uma classe para tratar esse erro retornando uma mensagem no body da requisição:

@ExceptionHandler(TokenInvalidoException.class)
public ResponseEntity tratarErroTokenInvalido(TokenInvalidoException exception) {
    return ResponseEntity.status(HttpStatus.FORBIDDEN).body(exception.getMessage());
}

Porém quando testo, esse erro está sendo lançado mas não está sendo capturado pelo handler, ou seja, não está vindo nada na resposta. Alguém poderia me ajudar ?

3 respostas

Olá Henrique, tudo bem?

Pelo que entendi, você está lançando uma exceção de Token Inválido e tentando capturá-la em um Handler de erros, mas não está recebendo a mensagem de erro esperada.

Uma possível solução para o seu problema é adicionar a anotação @ResponseBody no método tratarErroTokenInvalido, para que o retorno seja convertido em um corpo de resposta HTTP. Ficaria assim:

@ExceptionHandler(TokenInvalidoException.class)
@ResponseBody
public ResponseEntity tratarErroTokenInvalido(TokenInvalidoException exception) {
    return ResponseEntity.status(HttpStatus.FORBIDDEN).body(exception.getMessage());
}

Outra possível solução é adicionar a anotação @RestControllerAdvice na classe do Handler de erros, para que o Spring trate automaticamente as exceções e retorne a mensagem de erro no corpo da resposta HTTP. Ficaria assim:

@RestControllerAdvice
public class ExceptionHandlerController {

    @ExceptionHandler(TokenInvalidoException.class)
    public ResponseEntity tratarErroTokenInvalido(TokenInvalidoException exception) {
        return ResponseEntity.status(HttpStatus.FORBIDDEN).body(exception.getMessage());
    }
}

Espero que uma dessas soluções funcione para você. Caso contrário, tente verificar se a exceção está sendo lançada corretamente na classe TokenService e se o Handler de erros está sendo chamado na hora certa.

Espero ter ajudado e bons estudos!

Minha classe ja esta anotada com o @RestControllerAdvice. Os outros tratamentos que estou fazendo já estao funcionando corretamente. Apenas para essa exceção que estou lançando no método getSubject() que esta apresentando esse comportamento. Pelo que eu pude analisar o codigo nem está chegando no Handler, algo no meio do processo ja esta lançando uma resposta 403 sem nemhum body.

Olá Henrique,

Se a exceção TokenInvalidoException está sendo lançada no método getSubject() e não está chegando ao Handler de erros anotado com @RestControllerAdvice, é possível que outra camada do seu aplicativo esteja capturando e tratando a exceção antes de chegar ao ponto onde você espera.

Para resolver esse problema, você pode tentar o seguinte:

Verifique se não há outros manipuladores de exceção ou interceptadores configurados que possam estar capturando a exceção antes de chegar ao seu Handler de erros. Isso pode incluir configurações globais, filtros ou outros interceptadores.

Verifique se o pacote que contém o Handler de erros está sendo escaneado corretamente pelo Spring. Certifique-se de que a classe do Handler de erros está no caminho de pacote escaneado pelo Spring.

Se a exceção TokenInvalidoException for uma subclasse de RuntimeException, verifique se não há outros manipuladores de exceção específicos para RuntimeException que estejam sendo aplicados antes do seu Handler de erros. Nesse caso, a exceção pode estar sendo tratada por um manipulador mais genérico antes de chegar ao manipulador específico.

Verifique se a exceção TokenInvalidoException não está sendo capturada e tratada em outro ponto do código antes de chegar ao ponto onde você espera. Isso pode envolver uma chamada de método ou outra lógica de tratamento dentro do método getSubject().

Adicione logs de depuração em diferentes partes do código para rastrear o fluxo de execução e identificar onde exatamente a exceção está sendo tratada ou onde está sendo perdida.

Certifique-se de revisar todas essas possibilidades para identificar a causa raiz do problema. Se necessário, compartilhe mais detalhes sobre a estrutura do seu aplicativo e configurações relevantes para que eu possa ajudá-lo de forma mais precisa.

Espero que isso ajude a resolver o problema. Se você tiver mais dúvidas, fique à vontade para perguntar.