From 1cf85f5c5a66e3383fe11c3e241a018ae7100b8b Mon Sep 17 00:00:00 2001 From: Nong AnuchitO Date: Thu, 21 Mar 2024 13:16:52 +0700 Subject: [PATCH] add Exceptions package --- .../kbazaar/exceptions/ApiErrorResponse.java | 59 +++++++++++++++++++ .../ControllerExceptionHandler.java | 56 ++++++++++++++++++ .../exceptions/InternalServerException.java | 7 +++ .../kbazaar/exceptions/NotFoundException.java | 7 +++ .../kbazaar/product/ProductService.java | 6 +- 5 files changed, 132 insertions(+), 3 deletions(-) create mode 100644 kbazaar/src/main/java/com/kampus/kbazaar/exceptions/ApiErrorResponse.java create mode 100644 kbazaar/src/main/java/com/kampus/kbazaar/exceptions/ControllerExceptionHandler.java create mode 100644 kbazaar/src/main/java/com/kampus/kbazaar/exceptions/InternalServerException.java create mode 100644 kbazaar/src/main/java/com/kampus/kbazaar/exceptions/NotFoundException.java diff --git a/kbazaar/src/main/java/com/kampus/kbazaar/exceptions/ApiErrorResponse.java b/kbazaar/src/main/java/com/kampus/kbazaar/exceptions/ApiErrorResponse.java new file mode 100644 index 0000000..ea21eb1 --- /dev/null +++ b/kbazaar/src/main/java/com/kampus/kbazaar/exceptions/ApiErrorResponse.java @@ -0,0 +1,59 @@ +package com.kampus.kbazaar.exceptions; + +import java.time.LocalDateTime; + +public class ApiErrorResponse { + private LocalDateTime timestamp; + private int status; + private String error; + private String message; + private String path; + + public ApiErrorResponse(LocalDateTime timestamp, int status, String error, String message, String path) { + this.timestamp = timestamp; + this.status = status; + this.error = error; + this.message = message; + this.path = path; + } + + public LocalDateTime getTimestamp() { + return timestamp; + } + + public void setTimestamp(LocalDateTime timestamp) { + this.timestamp = timestamp; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } +} diff --git a/kbazaar/src/main/java/com/kampus/kbazaar/exceptions/ControllerExceptionHandler.java b/kbazaar/src/main/java/com/kampus/kbazaar/exceptions/ControllerExceptionHandler.java new file mode 100644 index 0000000..f0525f6 --- /dev/null +++ b/kbazaar/src/main/java/com/kampus/kbazaar/exceptions/ControllerExceptionHandler.java @@ -0,0 +1,56 @@ +package com.kampus.kbazaar.exceptions; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.context.request.WebRequest; + +import java.time.LocalDateTime; +import java.util.List; + +@RestControllerAdvice +public class ControllerExceptionHandler { + + @ExceptionHandler(value = {MethodArgumentNotValidException.class}) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ApiErrorResponse handleBadRequestException(MethodArgumentNotValidException notValidException, WebRequest request) { + List error = notValidException.getFieldErrors() + .stream() + .map(f -> f.getField() + " " + f.getDefaultMessage()) + .toList(); + + return new ApiErrorResponse( + LocalDateTime.now(), + HttpStatus.BAD_REQUEST.value(), + HttpStatus.BAD_REQUEST.getReasonPhrase(), + String.join(", ", error), + request.getDescription(false) + ); + } + + @ExceptionHandler(value = {NotFoundException.class}) + @ResponseStatus(HttpStatus.NOT_FOUND) + public ApiErrorResponse handleNotFoundRequestException(NotFoundException notValidException, WebRequest request) { + return new ApiErrorResponse( + LocalDateTime.now(), + HttpStatus.NOT_FOUND.value(), + HttpStatus.NOT_FOUND.getReasonPhrase(), + notValidException.getMessage(), + request.getDescription(false) + ); + } + + @ExceptionHandler(value = {InternalServerException.class}) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + public ApiErrorResponse handleInternalServerException(InternalServerException internalServerException, WebRequest request) { + return new ApiErrorResponse( + LocalDateTime.now(), + HttpStatus.INTERNAL_SERVER_ERROR.value(), + HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase(), + internalServerException.getMessage(), + request.getDescription(false) + ); + } +} diff --git a/kbazaar/src/main/java/com/kampus/kbazaar/exceptions/InternalServerException.java b/kbazaar/src/main/java/com/kampus/kbazaar/exceptions/InternalServerException.java new file mode 100644 index 0000000..b686c09 --- /dev/null +++ b/kbazaar/src/main/java/com/kampus/kbazaar/exceptions/InternalServerException.java @@ -0,0 +1,7 @@ +package com.kampus.kbazaar.exceptions; + +public class InternalServerException extends RuntimeException { + public InternalServerException(String message) { + super(message); + } +} diff --git a/kbazaar/src/main/java/com/kampus/kbazaar/exceptions/NotFoundException.java b/kbazaar/src/main/java/com/kampus/kbazaar/exceptions/NotFoundException.java new file mode 100644 index 0000000..d4efb87 --- /dev/null +++ b/kbazaar/src/main/java/com/kampus/kbazaar/exceptions/NotFoundException.java @@ -0,0 +1,7 @@ +package com.kampus.kbazaar.exceptions; + +public class NotFoundException extends RuntimeException { + public NotFoundException(String message) { + super(message); + } +} diff --git a/kbazaar/src/main/java/com/kampus/kbazaar/product/ProductService.java b/kbazaar/src/main/java/com/kampus/kbazaar/product/ProductService.java index 8c3bbdd..ea96be1 100644 --- a/kbazaar/src/main/java/com/kampus/kbazaar/product/ProductService.java +++ b/kbazaar/src/main/java/com/kampus/kbazaar/product/ProductService.java @@ -2,6 +2,8 @@ import java.util.List; import java.util.Optional; + +import com.kampus.kbazaar.exceptions.NotFoundException; import org.springframework.stereotype.Service; @Service @@ -29,9 +31,7 @@ public List getAll() { public ProductResponse getBySku(String sku) { Optional product = productRepository.findBySku(sku); if (product.isEmpty()) { - // throw new ProductNotFoundException("Product not found"); - // TODO: handle exception - return null; + throw new NotFoundException("Product not found"); } return product.get().toResponse();