Tratamento global de exceções com @ControllerAdvice
Centralize o tratamento de exceções em todos os controladores com @ExceptionHandler e @ControllerAdvice.
Tratamento global de exceções com @ControllerAdvice é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.
O problema sem o tratamento global
Sem o tratamento global de exceções, todo método de controlador precisa de blocos de tentativa e captura, a criação de respostas de erro é duplicada e os detalhes das exceções vazam para os clientes.
@ControllerAdvice e @RestControllerAdvice
@ControllerAdvice define uma classe global de tratamento de exceções. @RestControllerAdvice adiciona @ResponseBody para que todos os métodos manipuladores retornem JSON automaticamente.
@RestControllerAdvice
public class GlobalExceptionHandler {
// @ExceptionHandler methods go here
}Métodos @ExceptionHandler
Anote um método com @ExceptionHandler(ExceptionType.class). O Spring encaminha exceções desse tipo (e de subclasses) para o método. Retorne um ResponseEntity com o status apropriado.
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFound(ResourceNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(new ErrorResponse("NOT_FOUND", ex.getMessage()));
}Tratando vários tipos de exceção
Liste vários tipos de exceção em um único manipulador ou use uma classe base comum. O Spring escolhe o manipulador mais específico disponível.
@ExceptionHandler({IllegalArgumentException.class, IllegalStateException.class})
public ResponseEntity<ErrorResponse> handleBadRequest(RuntimeException ex) {
return ResponseEntity.badRequest()
.body(new ErrorResponse("BAD_REQUEST", ex.getMessage()));
}Tratando erros de validação
Capture MethodArgumentNotValidException para extrair erros no nível dos campos dos corpos de requisição validados com @Valid.
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, Object>> handleValidation(MethodArgumentNotValidException ex) {
Map<String, String> fieldErrors = new LinkedHashMap<>();
ex.getBindingResult().getFieldErrors().forEach(e ->
fieldErrors.put(e.getField(), e.getDefaultMessage()));
return ResponseEntity.badRequest()
.body(Map.of("errors", fieldErrors, "status", 400));
}Tratando violações de restrições
ConstraintViolationException é lançada ao validar parâmetros de métodos com @Validated na camada de serviço. Trate-a separadamente dos erros de validação do MVC.
@ExceptionHandler(ConstraintViolationException.class)
public ResponseEntity<Map<String, String>> handleConstraint(ConstraintViolationException ex) {
Map<String, String> errors = new LinkedHashMap<>();
ex.getConstraintViolations().forEach(v ->
errors.put(v.getPropertyPath().toString(), v.getMessage()));
return ResponseEntity.badRequest().body(errors);
}Acesso a HttpServletRequest
Adicione HttpServletRequest como parâmetro para obter detalhes da requisição (URL, método e cabeçalhos) para registro em log ou inclusão na resposta de erro.
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleAll(Exception ex, HttpServletRequest req) {
log.error("Unhandled error on {} {}", req.getMethod(), req.getRequestURI(), ex);
return ResponseEntity.internalServerError()
.body(new ErrorResponse("INTERNAL_ERROR", "Unexpected error"));
}@ResponseStatus em classes de exceção
Anote classes de exceção personalizadas com @ResponseStatus para definir automaticamente o status HTTP sem um método manipulador — uma opção mais simples para casos diretos.
@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException(String msg) { super(msg); }
}Definindo o escopo de @ControllerAdvice
Restrinja o advice a pacotes, anotações ou classes base específicos usando atributos em @ControllerAdvice.
@RestControllerAdvice(basePackages = "com.example.api")
public class ApiExceptionHandler { ... }
@RestControllerAdvice(assignableTypes = {UserController.class, OrderController.class})
public class SpecificHandler { ... }Registro em log nos manipuladores de exceções
Registre as exceções no nível apropriado: erros do usuário (4xx) em WARN; erros inesperados (5xx) em ERROR, com o rastreamento completo da pilha.
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleAll(Exception ex, HttpServletRequest req) {
if (ex instanceof BusinessException) log.warn("Business error: {}", ex.getMessage());
else log.error("Unexpected error on {}", req.getRequestURI(), ex);
return ...
}Prioridade dos manipuladores de exceções
O Spring seleciona o manipulador mais específico. Se ResourceNotFoundException extends RuntimeException, um manipulador para ResourceNotFoundException tem prioridade sobre um para RuntimeException.
Verificação rápida
Qual anotação marca um método para tratar globalmente um tipo específico de exceção?
Recapitulação
Use @RestControllerAdvice + @ExceptionHandler para centralizar o tratamento de erros. Retorne ResponseEntity com uma estrutura de erro consistente. Trate a validação (MethodArgumentNotValidException) e as restrições (ConstraintViolationException) separadamente. Registre 4xx como WARN e 5xx como ERROR.
Perguntas Frequentes
A aula “Tratamento global de exceções com @ControllerAdvice” é grátis?
Sim — o texto completo de “Tratamento global de exceções com @ControllerAdvice” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.
O que vou aprender em “Tratamento global de exceções com @ControllerAdvice”?
Centralize o tratamento de exceções em todos os controladores com @ExceptionHandler e @ControllerAdvice. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Java Academy?
Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Tratamento global de exceções com @ControllerAdvice”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Java Academy?
Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Validação de beans: @NotNull, @Size, @Pattern
- Anotações de restrição personalizadas
- Tratamento global de exceções com @ControllerAdvice
- Detalhes de problemas RFC 7807 e respostas de erro consistentes