1
resposta

[Dúvida] ExceptionHandler

Caso no header não seja enviado um token, acho mais apropriado retornar um 401 Unauthorized ou 403 Forbidden, em vez de um erro 500 do servidor.

Tentei implementar da forma abaixo, mas continua retornando o código 500. Qual seria a maneira de fazer isso?

Criei uma nova Exception:

public class AutenticacaoException extends RuntimeException {}

Lancei essa Exception no método de obterToken na classe SecurityFilter

        String authHeader = request.getHeader("Authorization");

        if (authHeader == null) {
            throw new AutenticacaoException("Usuário não autenticado.");
        }

Na classe ErrorHandler, adicionei um novo método para tratar essa exceção:

    @ExceptionHandler(AutenticacaoException.class)
    public ResponseEntity<String> handleAutenticacaoException(AutenticacaoException exception) {
        return ResponseEntity.status(401).body(exception.getMessage());
    }

Retorno:

{
    "timestamp": "2023-04-16T16:38:50.151+00:00",
    "status": 500,
    "error": "Internal Server Error",
    "message": "Usuário não autenticado.",
    "path": "/medicos"
}

Aparentemente a exceção não está caindo no ExceptionHandler, por algum motivo que desconheço. Continua retornando o status code 500, apesar de eu ter parametrizado para retornar 401.

1 resposta

Parece que a exceção não está sendo capturada pelo manipulador de exceção (ExceptionHandler) porque o Spring não está conseguindo encontrá-lo.

Verifique se a classe ErrorHandler está anotada com @ControllerAdvice e se o pacote dela está sendo escaneado pelo componente Spring. Por exemplo:

@ControllerAdvice(basePackages = "com.example.package") public class ErrorHandler { ... }

Além disso, certifique-se de que o método handleAutenticacaoException na classe ErrorHandler esteja anotado com @ResponseBody. Por exemplo:

@ExceptionHandler(AutenticacaoException.class) @ResponseBody public ResponseEntity handleAutenticacaoException(AutenticacaoException exception) { return ResponseEntity.status(401).body(exception.getMessage()); }

Isso faz com que o resultado do método seja serializado no corpo da resposta HTTP.

Se essas alterações não resolverem o problema, pode ser útil habilitar o log de depuração do Spring para ver o que está acontecendo. Você pode fazer isso adicionando a seguinte linha no arquivo application.properties:

logging.level.org.springframework=DEBUG

Isso ativará o log de depuração para o pacote do Spring e ajudará a identificar quaisquer problemas de configuração que possam estar ocorrendo.