Como manipular exceção Internal Server Error no spring-boot

Olá pessoal, peço humildemente a ajuda de vocês para tentar resolver um problema. Criei uma classe para manipular as exceções REST, algumas das exceções consegui fazer funcionar e quando ocorrem, a response volta da forma como espero, mas por algum motivo quando a requisição gera um erro 500 (Internal Server Error) não funciona, estou a dois dias trabalhando nisso e ainda não descobri onde eu errei!

Segue uma parte do código:

@ControllerAdvice
public class RestApiExceptionHandler extends ResponseEntityExceptionHandler {

    @Autowired
    private MessageSource messageSource;

// outros métodos...

    @ExceptionHandler(value = {RuntimeException.class})
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ResponseEntity<Object> handleAllUncaughtException(RuntimeException ex, WebRequest request) {
        ObjectApiException objApiException = new ObjectApiException();
        objApiException.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
        objApiException.setDataHora(UtilitariosDateTimeUnB.getDataHoraAtual());
        objApiException.setMensagem("Erro interno do servidor");
        objApiException.setDetalhes(Arrays.asList(
                new ObjectApiExceptionDetail(
                        null,
                        this.messageSource.getMessage((MessageSourceResolvable) ex, LocaleContextHolder.getLocale()), // Mensagem de erro
                        ex.getCause().toString().split(": ")[0], // Classe
                        null
                )
        ));

        // "Logando" o erro no console.
        LogManager.getLogger(ex.getCause().toString().split(": ")[0]).error(ex.getCause().toString().split(": ")[1]);

        return ResponseEntity.internalServerError().body(objApiException);
    }
}

Quando testo no Postman não me retorna nada:

E o console me mostra o log de erro tratado no Log4J 2:

2021-07-09 14:46:08 [http-nio-80-exec-4] ERROR: [No property dataInicio found for type Banco!] at br.unb.webservices.dadosfuncionais.db.mssql.services.BancoService.findByDenominacaoContainingIgnoreCase:152

Minha application.properties:

spring.application.name=@project.name@
spring.profiles.active=@activatedProperties@
spring.messages.basename=messages
spring.messages.encoding=UTF-8
spring.output.ansi.enabled=always
server.port=80
server.error.include-stacktrace=on-param
server.error.whitelabel.enabled=false
server.error.include-message=always

Se alguém conseguiu retornar o Response para esse erro, por favor, me auxiliem aqui!

Desde já agradeço.

Vc colocou para tratar exceções do tipo RuntimeException. Talvez a exceção que esteja sendo estourada não seja desse tipo.

Tente alterar para usar Exception.class:

@ExceptionHandler(value = { Exception.class })

Esse jeito tb vai capturar exceções do tipo RuntimeException, pois ela é filha de Exception.

Doc: Class RuntimeException

1 curtida

@Lucas_Camara, fiz a alteração, porém, não resolveu!

Vc alterou na assinatura do método tb?

public ResponseEntity<Object> handleAllUncaughtException(Exception ex, WebRequest request) {

Sim, alterei!

Tu sabe qual é a exceção para o caso que não está funcionando?

Cara, até onde notei, várias que geram erro 500 não estão sendo exibidas, mas neste caso específico, org.springframework.data.mapping.PropertyReferenceException, que gerei propositalmente para testar, não está mostrando! Outras não estão sendo tratadas, que é o caso da com.fasterxml.jackson.databind.exc.InvalidFormatException que retorna o response padrão do Spring, mesmo com o handler específico.

Talvez essas sejam validações que ocorrem antes mesmo de o código do endpoint ser executado, e nem caia no handler, mas não tenho certeza.

Por exemplo, se vc lançar uma exceção no corpo de um endpoint (ex.: new Exception("alguma coisa")), funciona?

Acabei de testar aqui, forcei um erro 500 na controller, ainda assim não funcionou.
Deve estar faltando alguma configuração, e não sei qual é, pois não faz sentido!

Como o método já está retornando um ResponseEntity como internal server error, acho que não precisa dessa anotação: @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR). Tente remove-la para ver se muda algo.

Já havia feito isso, e nada!