From 22ff458756d4ca42f1cbbc54febd439da58e97c0 Mon Sep 17 00:00:00 2001 From: helori_ollivier Date: Mon, 24 Nov 2025 14:47:01 +0100 Subject: [PATCH] improved error handling --- .../exceptions/CorpoNotFoundException.java | 2 +- .../exceptions/FacilityNotFoundException.java | 2 +- .../NotEnoughtRessourceException.java | 4 +++ .../api/exceptions/NotFoundException.java | 7 ++++ .../RessourceNotFoundException.java | 2 +- .../api/exceptions/ShipNotFoundException.java | 2 +- .../galactik/api/service/CorpoService.java | 2 +- .../api/utils/CustomErrorResponse.java | 32 +++++++++++++++++++ .../api/utils/CustomExceptionHandler.java | 28 ++++++++++++++++ 9 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 src/main/java/bzh/risotto/galactik/api/exceptions/NotFoundException.java create mode 100644 src/main/java/bzh/risotto/galactik/api/utils/CustomErrorResponse.java create mode 100644 src/main/java/bzh/risotto/galactik/api/utils/CustomExceptionHandler.java diff --git a/src/main/java/bzh/risotto/galactik/api/exceptions/CorpoNotFoundException.java b/src/main/java/bzh/risotto/galactik/api/exceptions/CorpoNotFoundException.java index 60b29d7..49888e2 100644 --- a/src/main/java/bzh/risotto/galactik/api/exceptions/CorpoNotFoundException.java +++ b/src/main/java/bzh/risotto/galactik/api/exceptions/CorpoNotFoundException.java @@ -1,6 +1,6 @@ package bzh.risotto.galactik.api.exceptions; -public class CorpoNotFoundException extends RuntimeException { +public class CorpoNotFoundException extends NotFoundException { public CorpoNotFoundException(Long id) { super("Corpo: " + id + " not found"); diff --git a/src/main/java/bzh/risotto/galactik/api/exceptions/FacilityNotFoundException.java b/src/main/java/bzh/risotto/galactik/api/exceptions/FacilityNotFoundException.java index 6b4819a..ada327d 100644 --- a/src/main/java/bzh/risotto/galactik/api/exceptions/FacilityNotFoundException.java +++ b/src/main/java/bzh/risotto/galactik/api/exceptions/FacilityNotFoundException.java @@ -1,6 +1,6 @@ package bzh.risotto.galactik.api.exceptions; -public class FacilityNotFoundException extends RuntimeException { +public class FacilityNotFoundException extends NotFoundException { public FacilityNotFoundException(Long id) { super("Facilty: " + id + " not found"); diff --git a/src/main/java/bzh/risotto/galactik/api/exceptions/NotEnoughtRessourceException.java b/src/main/java/bzh/risotto/galactik/api/exceptions/NotEnoughtRessourceException.java index 9e16c2c..1093070 100644 --- a/src/main/java/bzh/risotto/galactik/api/exceptions/NotEnoughtRessourceException.java +++ b/src/main/java/bzh/risotto/galactik/api/exceptions/NotEnoughtRessourceException.java @@ -6,6 +6,10 @@ public class NotEnoughtRessourceException extends RuntimeException { super("corpo: " + corpoId + " has not enough resource of type: " + ressourceId); } + public NotEnoughtRessourceException(String ressource, String corpo) { + super("corpo: " + corpo + " has not enough resource of type: " + ressource); + } + public NotEnoughtRessourceException(String msg) { super(msg); } diff --git a/src/main/java/bzh/risotto/galactik/api/exceptions/NotFoundException.java b/src/main/java/bzh/risotto/galactik/api/exceptions/NotFoundException.java new file mode 100644 index 0000000..dfce852 --- /dev/null +++ b/src/main/java/bzh/risotto/galactik/api/exceptions/NotFoundException.java @@ -0,0 +1,7 @@ +package bzh.risotto.galactik.api.exceptions; + +public class NotFoundException extends RuntimeException { + public NotFoundException(String message) { + super(message); + } +} diff --git a/src/main/java/bzh/risotto/galactik/api/exceptions/RessourceNotFoundException.java b/src/main/java/bzh/risotto/galactik/api/exceptions/RessourceNotFoundException.java index b270ec6..69ee795 100644 --- a/src/main/java/bzh/risotto/galactik/api/exceptions/RessourceNotFoundException.java +++ b/src/main/java/bzh/risotto/galactik/api/exceptions/RessourceNotFoundException.java @@ -1,6 +1,6 @@ package bzh.risotto.galactik.api.exceptions; -public class RessourceNotFoundException extends RuntimeException { +public class RessourceNotFoundException extends NotFoundException { public RessourceNotFoundException(int ressourceId) { super("Ressource: " + ressourceId + " not found"); diff --git a/src/main/java/bzh/risotto/galactik/api/exceptions/ShipNotFoundException.java b/src/main/java/bzh/risotto/galactik/api/exceptions/ShipNotFoundException.java index 9f1aaf2..f1af5d2 100644 --- a/src/main/java/bzh/risotto/galactik/api/exceptions/ShipNotFoundException.java +++ b/src/main/java/bzh/risotto/galactik/api/exceptions/ShipNotFoundException.java @@ -1,6 +1,6 @@ package bzh.risotto.galactik.api.exceptions; -public class ShipNotFoundException extends RuntimeException { +public class ShipNotFoundException extends NotFoundException { public ShipNotFoundException(long shipId) { super("Ship: " + shipId + " not found"); diff --git a/src/main/java/bzh/risotto/galactik/api/service/CorpoService.java b/src/main/java/bzh/risotto/galactik/api/service/CorpoService.java index f5b9f00..1fea0bb 100644 --- a/src/main/java/bzh/risotto/galactik/api/service/CorpoService.java +++ b/src/main/java/bzh/risotto/galactik/api/service/CorpoService.java @@ -89,7 +89,7 @@ public class CorpoService { } if (ressource.getQuantity() <= value) { - throw new NotEnoughtRessourceException(ressourceId, corpoId); + throw new NotEnoughtRessourceException(ressource.getType().getName(), corpo.getName()); } else { res = true; diff --git a/src/main/java/bzh/risotto/galactik/api/utils/CustomErrorResponse.java b/src/main/java/bzh/risotto/galactik/api/utils/CustomErrorResponse.java new file mode 100644 index 0000000..f591d19 --- /dev/null +++ b/src/main/java/bzh/risotto/galactik/api/utils/CustomErrorResponse.java @@ -0,0 +1,32 @@ +package bzh.risotto.galactik.api.utils; + +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; +import org.springframework.http.ProblemDetail; +import org.springframework.lang.NonNull; +import org.springframework.web.ErrorResponse; + +public class CustomErrorResponse implements ErrorResponse { + + HttpStatus status; + ProblemDetail detail; + + public CustomErrorResponse(HttpStatus status, ProblemDetail detail) { + super(); + + this.status = status; + this.detail = detail; + } + + @Override + @NonNull + public HttpStatusCode getStatusCode() { + return this.status; + } + + @Override + @NonNull + public ProblemDetail getBody() { + return this.detail; + } +} diff --git a/src/main/java/bzh/risotto/galactik/api/utils/CustomExceptionHandler.java b/src/main/java/bzh/risotto/galactik/api/utils/CustomExceptionHandler.java new file mode 100644 index 0000000..5ab524c --- /dev/null +++ b/src/main/java/bzh/risotto/galactik/api/utils/CustomExceptionHandler.java @@ -0,0 +1,28 @@ +package bzh.risotto.galactik.api.utils; + +import bzh.risotto.galactik.api.exceptions.*; +import org.springframework.beans.factory.parsing.Location; +import org.springframework.beans.factory.parsing.Problem; +import org.springframework.http.HttpStatus; +import org.springframework.http.ProblemDetail; +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.context.request.WebRequest; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + +@ControllerAdvice +public class CustomExceptionHandler extends ResponseEntityExceptionHandler { + + @ExceptionHandler(NotFoundException.class) + public ProblemDetail handleNotFoundException(NotFoundException ex, WebRequest request) { + return ProblemDetail.forStatusAndDetail(HttpStatus.NOT_FOUND, ex.getMessage()); + } + + @ExceptionHandler(NotEnoughtRessourceException.class) + public ProblemDetail handleNotEnoughtResourceException(NotEnoughtRessourceException ex, WebRequest request) { + return ProblemDetail.forStatusAndDetail(HttpStatus.INTERNAL_SERVER_ERROR, ex.getMessage()); + } + +}