diff --git a/backend/src/main/java/com/oskarwiedeweg/cloudwork/error/GlobalErrorHandler.java b/backend/src/main/java/com/oskarwiedeweg/cloudwork/error/GlobalErrorHandler.java new file mode 100644 index 0000000..35904ee --- /dev/null +++ b/backend/src/main/java/com/oskarwiedeweg/cloudwork/error/GlobalErrorHandler.java @@ -0,0 +1,45 @@ +package com.oskarwiedeweg.cloudwork.error; + +import com.oskarwiedeweg.cloudwork.error.dto.ErrorDto; +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; +import org.springframework.http.ResponseEntity; +import org.springframework.web.ErrorResponse; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.server.ResponseStatusException; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import java.time.LocalDateTime; + +@ControllerAdvice +public class GlobalErrorHandler { + + @ExceptionHandler(Throwable.class) + public ResponseEntity handleError(Throwable throwable) { + if (!(throwable instanceof ErrorResponse errorResponse)) { + return construct(HttpStatus.INTERNAL_SERVER_ERROR, HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase()); + } + return construct(errorResponse.getStatusCode(), + HttpStatus.resolve(errorResponse.getStatusCode().value()).getReasonPhrase()); + } + + @ExceptionHandler(ResponseStatusException.class) + public ResponseEntity handleError(ResponseStatusException throwable) { + return construct(throwable.getStatusCode(), throwable.getMessage()); + } + + + private ResponseEntity construct(HttpStatusCode statusCode, Object error) { + return ResponseEntity.status(statusCode).body(new ErrorDto( + statusCode.value(), + ServletUriComponentsBuilder.fromCurrentRequest() + .build() + .getPath(), + error, + LocalDateTime.now() + )); + } + + +} diff --git a/backend/src/main/java/com/oskarwiedeweg/cloudwork/error/dto/ErrorDto.java b/backend/src/main/java/com/oskarwiedeweg/cloudwork/error/dto/ErrorDto.java new file mode 100644 index 0000000..85018fe --- /dev/null +++ b/backend/src/main/java/com/oskarwiedeweg/cloudwork/error/dto/ErrorDto.java @@ -0,0 +1,6 @@ +package com.oskarwiedeweg.cloudwork.error.dto; + +import java.time.LocalDateTime; + +public record ErrorDto(int status, String path, Object error, LocalDateTime timestamp) { +}