Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Não retorna meu objeto de erro customizado

Estou tentando devolver um erro customizado como resposta para o cliente, porém ele continua respondendo aquele JSON com a stacktrace e tudo.

Segue código das classes

TopicoController.java

// código acima omitido
    @GetMapping("/{id}/test")
    public ResponseEntity<TopicoDto> testando(@PathVariable Long id) {
        throw new TestErroException("INCOMPLETO", "Não foi possível porque está incompleto");
    }

//código abaixo omitido

TestErroException.java

public class TestErroException extends RuntimeException {

    private String status;
    private String message;
    private LocalDateTime dateTime = LocalDateTime.now();

    public TestErroException(String status, String message) {
        this.status = status;
        this.message = message;
    }

    // gets omitidos

ErroDeValidacao.java

    @ResponseStatus(code = HttpStatus.NOT_FOUND)
    @ExceptionHandler(TestErroException.class)
    public TestErroException handleTestErroException(TestErroException exception) {
        System.out.println("Estou entrando no método handle para resolver a exception lançada no controller");
        return exception;
    }

Ele entra no handler dessa exception, consegue fazer o sysout no console só que o retorno é aquele JSON completo que o professor mostrou no vídeo anterior.

Eu percebi que no final daquele JSON completo, ele incluiu os campos que se referem ao meu objeto de erro customizado.

3 respostas

Oi Leonardo,

Talvez seja porque no seu método handleTestErroException você está retornando a própria exception.

Faz o seguinte teste simples para verificar se o json devolvido muda:

@ResponseStatus(code = HttpStatus.NOT_FOUND)
@ExceptionHandler(TestErroException.class)
public String handleTestErroException(TestErroException exception) {
    System.out.println("Estou entrando no método handle para resolver a exception lançada no controller");
    return "Teste Tratamento Exception";
}

Oi Rodrigo,

Eu fiz o teste acima e ele me retornou somente a String no body. Funcionou corretamente. Aí tentei fazer o seguinte teste:

    @ResponseStatus(code = HttpStatus.NOT_FOUND)
    @ExceptionHandler(TestErroException.class)
    public TestErroException handleTestErroException(TestErroException exception) {
        System.out.println("Estou entrando no método handle para resolver a exception lançada no controller");
        return new TestErroException(exception.getMessage(), "Teste");
    }

E ainda assim, ele me retornou o JSON com a stacktrace appendando os atributos do meu JSON customizado. Será que tem alguma relação de eu estar extendendo a RuntimeException?

solução!

Oi Leonardo,

Então o problema é justamente esse.

Você deve criar um DTO para representar esse erro e o retorno do método deve ser o DTO e não o objeto Exception.

Se devolver uma exception o Spring vai adicionar a stacktrace no json de retorno.