3
respostas

Tratamento 404

Boa tarde,

Fiz o tratamento 404 com RestControllerAdvice como explicado com o Erro 500, porém não realiza o tratamento, via debug vi que o método é chamado, porém estoura o erro 500 para o usuário. Segue abaixo os códigos.

ErrorNotFoundHandler.java


@RestControllerAdvice public class ErrorNotFoundHandler { @Autowired private MessageSource messageSource;

@ExceptionHandler(EntityNotFoundException.class)
@ResponseStatus(code = HttpStatus.NOT_FOUND)
public ExcecaoDTO handle(EntityNotFoundException exception) {
        String mensagem = messageSource.getMessage(exception.getMessage(), null, LocaleContextHolder.getLocale());
        return new ExcecaoDTO(mensagem, exception.getClass().getName());
}

}

TopicosController.java


@GetMapping(value = "/{id}") public ResponseEntity detalhar(@PathVariable(required = true ) Long id) {

    Topico topico = topicoRepository.getReferenceById(id);
    return ResponseEntity.ok().body(new DetalhesTopicoDto(topico));
}

Erro


"timestamp": "2022-07-08T17:22:11.570+00:00", "status": 500, "error": "Internal Server Error", "trace": "javax.persistence.EntityNotFoundException: Unable to find br.com.alura.forum.modelo.Topico with id 10\r\n\tat

3 respostas

Oi Igor,

Você tem outras classes controller advice no seu projeto? Posta o código delas aqui.

Oi Rodrigo, Tenho sim, segue. Consegui resolver o problema tirando esta linha de código: String mensagem = messageSource.getMessage(exception.getMessage(), null, LocaleContextHolder.getLocale());

e colocando essa

String mensagem = exception.getMessage(); return new ExcecaoDTO(mensagem, exception.getClass().getName());

Acredito que o problema seja neste método messageSource.getMessage.

Classe Advice

@RestControllerAdvice public class ErroDeValidacaoHandler {

@Autowired
private MessageSource messageSource;

@ResponseStatus(code = HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public List<ExcecaoDTO> handle(MethodArgumentNotValidException exception) {

    List<ExcecaoDTO> errosFormulario = new ArrayList<>();
    List<FieldError> fieldErros = exception.getBindingResult().getFieldErrors();

    /*for (FieldError er : fieldErros) {
        errosFormulario.add(new ErroDeFormularioDTO(er.getField(), er.getDefaultMessage()));
    }*/
    fieldErros.forEach(e  -> {
        String mensagem = messageSource.getMessage(e, LocaleContextHolder.getLocale());
        errosFormulario.add(new ExcecaoDTO(e.getField(), mensagem));
    });

    return errosFormulario;

}

}

Ah sim, no caso da sua classe ErrorNotFoundHandler não vai ter mesmo essa linha de código pra recuperar a mensagem via messageSource.getMessage, pois não é uma mensagem do Bean Validation.

Bons estudos!