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

Tratativa de erro quando na URI não é enviado um número e sim uma letra...

Os exemplos, demonstrados em aula, cobrem os erros 404 para solicitações de registros que não constão na base.

Como no exemplo da solicitação do método GET abaixo.

http://localhost:8080/topicos/999

Porém se enviarmos a solicitação com letra ocorre um erro que é retornado ao usuário. Como no exemplo.

http://localhost:8080/topicos/aaa

Esse erro ocorre pois o endpoint espera um número no parâmetro e enviamos letras, gerando assim uma excessão. Fiz uma implementação de melhoria, conforme abaixo, e gostaria de receber duas sugestões sobre o tema, sendo:

--> Há uma forma mais inteligente de fazê-lo utilizando @RestControllerAdvice já que essa anotação captura as excessões que ocorrem no @RestController?

--> Como vocês implementariam essa melhoria sem utillizar o @RestCoontrollerAdvice pois oque me incomodou na implementação que fiz foi o fato de repetir "return ResponseEntity.notFound().build(); " no try e no cach ? Se bem que essa opção poderia ser uma vantagem caso queira enviar mensagem personalizada sobre a sintaxe esperada na URI.

    @GetMapping("/{id}")
    public ResponseEntity<DetalhesTopicoDto> detalhar(@PathVariable String id) {
        try {
            Optional<Topico> topico = topicoRepository.findById(Long.valueOf(id));
            if(topico.isPresent()) {
                return ResponseEntity.ok(new DetalhesTopicoDto(topico.get()));
            }
            return ResponseEntity.notFound().build();
        } catch (Exception e) {
            return ResponseEntity.notFound().build();
        }        
    }
2 respostas
solução!

Oi Emerson,

Nesse caso o ideal seria criar outro Exception Handler no RestControllerAdvice, para tratar dessa situação em específico.

Basta ter um método que lida com a excpetion do tipo MethodArgumentTypeMismatchException:

@ExceptionHandler(MethodArgumentTypeMismatchException.class)

Bons estudos!

Olá Rodrigo,

A sua dica foi matadora :D

Embora eu não tenha consegui capturar a exceção utilizando MethodArgumentTypeMismatchException.class eu substituí por NumberFormatException.class e deu certo.

O método ficou assim:

    @ResponseStatus(code = HttpStatus.BAD_REQUEST)
    @ExceptionHandler(NumberFormatException.class)
    public void erroTypeFormat(NumberFormatException exception) {
    }

Agradeço pela pronta resposta.

Forte abraço.