Analisando e tentando me aprofundar um pouco, pesquisei algumas coisas e gostaria de uma ajuda: criei uma classe GlobalExceptionHandler que exnteds ResponseEntityExceptionHandler
algumas duvidas: 1º- Isso seria uma classe de erros customizados de acordo com o tipo da api? 2º- Quando devo ou não extender outra classe de 'Exception'? 3º- A classe extendida da ResponseEntityExceptionHandler, corresponde somente as entidades(DAO, Models, enfins...) que irão utilizar? 4º- Como saber ao longo do tempo quais metodos a mais criar? 5º - [Ajuda] Estou com um problema de return para erros de ConstraintViolationException no método criado, ele está retornando 400. 6º- Seria correto utilizar esta forma para excpetions em geral? Sem percisar tratar nada no controller?
@Slf4j(topic = "GLOBAL_EXCEPTION_HANDLER")
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY)
protected ResponseEntity<Object> handlerMethodArgumentNotValid(
MethodArgumentNotValidException ex,
HttpHeaders headers,
HttpStatus status,
WebRequest request) {
EntityErrorResponse errorResponse = new EntityErrorResponse(
HttpStatus.UNPROCESSABLE_ENTITY.value(),
ex.getMessage());
for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) {
errorResponse.addValidationError(fieldError.getField(), fieldError.getDefaultMessage());
}
return ResponseEntity.unprocessableEntity().body(errorResponse);
}
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
// Error 400 Bad Request
public ResponseEntity<Object> handleAllUncaughtException(
Exception ex,
WebRequest request) {
final String errorMessage = "Error não encontrado";
// Log de erro
log.error(errorMessage, ex);
return buildErrorResponse(
ex,
errorMessage,
HttpStatus.INTERNAL_SERVER_ERROR,
request);
}
private ResponseEntity<Object> buildErrorResponse(
Exception ex,
String errorMessage,
HttpStatus internalServerError,
WebRequest request) {
EntityErrorResponse errorResponse = new EntityErrorResponse(internalServerError.value(), errorMessage);
return ResponseEntity.status(internalServerError).body(errorResponse);
}
@ExceptionHandler(DataIntegrityViolationException.class)
@ResponseStatus(HttpStatus.CONFLICT)
// Error 409 Conflict
public ResponseEntity<Object> handleDataIntegrityViolationException(
DataIntegrityViolationException ex,
WebRequest request) {
String errorMessage = ex.getMostSpecificCause().getMessage();
log.error("Erro ao salvar novo médico com problema(s): " + errorMessage, ex);
return buildErrorResponse(
ex,
errorMessage,
HttpStatus.CONFLICT,
request);
}
@ExceptionHandler(ConstraintViolationException.class)
@ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY)
// Error 422 Unprocessable Entity
public ResponseEntity<Object> handleConstraintViolationException(
ConstraintViolationException ex,
WebRequest request) {
log.error("Erro de validação do elemento " + ex);
return buildErrorResponse(
ex,
HttpStatus.UNPROCESSABLE_ENTITY,
request);
}
private ResponseEntity<Object> buildErrorResponse(
Exception ex,
HttpStatus httpStatus,
WebRequest request) {
return buildErrorResponse(ex, ex.getMessage(),httpStatus, request);
}
}