A documentação de propriedades do Spring pode ser encontrada em https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html.
Quando ocorre um erro em uma requisição, o Spring retorna por padrão o código HTTP 500, que indica erro no servidor interno, junto com outras informações em formato JSON.
Para retornar códigos adequados, seria possível adicionar blocos try-catch nos métodos do controller para capturar exceções. Entretanto, essas exceções podem se repetir em vários métodos e utilizar try-catch para fazer o tratamento iria poluir a classe controller. Por isso, a melhor alternativa é criar uma classe que será responsável por realizar o tratamento de erros.
@RestControllerAdvice
public class TratadorDeErros {
@ExceptionHandler(EntityNotFoundException.class)
public ResponseEntity tratarErro404(){
return ResponseEntity.notFound().build();
}
}
Para que esta classe seja reconhecida pelo Spring, são necessárias duas anotações:
No código 400, o Spring retorna uma serie de informações que não são necessárias para o cliente, por isso, no tratamento é retornado somente as informações necessárias. Para isso, é necessário os erros da exceção, selecionar as informações necessárias em um DTO, e adicionar ao corpo da resposta.
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity tratarErro400(MethodArgumentNotValidException ex){
var erros = ex.getFieldErrors();
return ResponseEntity.badRequest().body(erros.stream().map(DadosErroValidacao::new).toList());
}
private record DadosErroValidacao(String campo, String mensagem){
public DadosErroValidacao(FieldError erro){
this(erro.getField(), erro.getDefaultMessage());
}
}
O que foi aprendido?
@RestControllerAdvice
;@ExceptionHandler
, do Spring, para indicar qual exception um determinado método da classe de tratamento de erros deve capturar;