From 24da0c4ba4280cdb45fb601c2197c084f2a9c8e2 Mon Sep 17 00:00:00 2001 From: dani820 Date: Sat, 28 Sep 2024 23:22:48 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feature:=20Custom=20Exception=EA=B3=BC=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=20=EC=9D=91=EB=8B=B5=20dto=20=EA=B5=AC?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/inmybook/error/ErrorCode.java | 19 +++++++ .../com/inmybook/error/ErrorResponseDto.java | 32 ++++++++++++ .../error/GlobalExceptionHandler.java | 51 +++++++++++++++++++ .../error/exception/InMyBookException.java | 16 ++++++ .../PostDeletionFailedException.java | 12 +++++ .../PostModificationFailedException.java | 12 +++++ .../exception/PostNotFoundException.java | 12 +++++ .../PostRegistrationFailedException.java | 12 +++++ 8 files changed, 166 insertions(+) create mode 100644 src/main/java/com/inmybook/error/ErrorCode.java create mode 100644 src/main/java/com/inmybook/error/ErrorResponseDto.java create mode 100644 src/main/java/com/inmybook/error/GlobalExceptionHandler.java create mode 100644 src/main/java/com/inmybook/error/exception/InMyBookException.java create mode 100644 src/main/java/com/inmybook/error/exception/PostDeletionFailedException.java create mode 100644 src/main/java/com/inmybook/error/exception/PostModificationFailedException.java create mode 100644 src/main/java/com/inmybook/error/exception/PostNotFoundException.java create mode 100644 src/main/java/com/inmybook/error/exception/PostRegistrationFailedException.java diff --git a/src/main/java/com/inmybook/error/ErrorCode.java b/src/main/java/com/inmybook/error/ErrorCode.java new file mode 100644 index 0000000..442cea2 --- /dev/null +++ b/src/main/java/com/inmybook/error/ErrorCode.java @@ -0,0 +1,19 @@ +package com.inmybook.error; + +import org.springframework.http.HttpStatus; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum ErrorCode { + INVALID_REQUEST(HttpStatus.BAD_REQUEST, "잘못된 요청입니다."), + NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 정보입니다."), + INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "서버 에러가 발생하였습니다."), + + POST_NOT_FOUND(HttpStatus.NOT_FOUND, "독서록 정보가 존재하지 않습니다."); + + private final HttpStatus httpStatus; + private final String message; +} diff --git a/src/main/java/com/inmybook/error/ErrorResponseDto.java b/src/main/java/com/inmybook/error/ErrorResponseDto.java new file mode 100644 index 0000000..b145fc9 --- /dev/null +++ b/src/main/java/com/inmybook/error/ErrorResponseDto.java @@ -0,0 +1,32 @@ +package com.inmybook.error; + +import org.springframework.http.ResponseEntity; + +import lombok.Builder; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@Builder +@RequiredArgsConstructor +public class ErrorResponseDto { + public final int httpStatus; + public final String code; + public final String message; + + public ErrorResponseDto(ErrorCode errorCode) { + this.httpStatus = errorCode.getHttpStatus().value(); + this.code = errorCode.name(); + this.message = errorCode.getMessage(); + } + + public static ResponseEntity error(ErrorCode errorCode) { + return ResponseEntity + .status(errorCode.getHttpStatus()) + .body(ErrorResponseDto.builder() + .httpStatus(errorCode.getHttpStatus().value()) + .code(errorCode.name()) + .message(errorCode.getMessage()) + .build()); + } +} diff --git a/src/main/java/com/inmybook/error/GlobalExceptionHandler.java b/src/main/java/com/inmybook/error/GlobalExceptionHandler.java new file mode 100644 index 0000000..a6481dc --- /dev/null +++ b/src/main/java/com/inmybook/error/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.inmybook.error; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import com.inmybook.error.exception.PostDeletionFailedException; +import com.inmybook.error.exception.PostModificationFailedException; +import com.inmybook.error.exception.PostNotFoundException; +import com.inmybook.error.exception.PostRegistrationFailedException; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(PostModificationFailedException.class) + protected ResponseEntity handlePostModificationFailedException( + PostModificationFailedException ex) { + log.error("handlePostModificationFailedException", ex); + return ErrorResponseDto.error(ex.getErrorCode()); + } + + @ExceptionHandler(PostNotFoundException.class) + protected ResponseEntity handlePostNotFoundException(PostNotFoundException ex) { + log.error("handlePostNotFoundException", ex); + return ErrorResponseDto.error(ex.getErrorCode()); + } + + @ExceptionHandler(PostRegistrationFailedException.class) + protected ResponseEntity handlePostRegistrationFailedException( + PostRegistrationFailedException ex) { + log.error("handlePostRegistrationFailedException", ex); + return ErrorResponseDto.error(ex.getErrorCode()); + } + + @ExceptionHandler(PostDeletionFailedException.class) + protected ResponseEntity handlePostDeletionFailedException(PostDeletionFailedException ex) { + log.error("handlePostDeletionFailedException", ex); + return ErrorResponseDto.error(ex.getErrorCode()); + } + + @ExceptionHandler(Exception.class) + protected ResponseEntity handleAllException(Exception ex) { + log.error("handleAllException", ex); + ErrorCode errorCode = ErrorCode.INTERNAL_SERVER_ERROR; + return ErrorResponseDto.error(errorCode); + } + +} diff --git a/src/main/java/com/inmybook/error/exception/InMyBookException.java b/src/main/java/com/inmybook/error/exception/InMyBookException.java new file mode 100644 index 0000000..2d30fdf --- /dev/null +++ b/src/main/java/com/inmybook/error/exception/InMyBookException.java @@ -0,0 +1,16 @@ +package com.inmybook.error.exception; + +import com.inmybook.error.ErrorCode; + +import lombok.Getter; + +@Getter +public class InMyBookException extends RuntimeException { + // ErrorCode가 HttpStatus, message를 가짐으로써 에러 변경 범위 최소화 + private final ErrorCode errorCode; + + public InMyBookException(ErrorCode errorCode) { + super(errorCode.getMessage()); + this.errorCode = errorCode; + } +} diff --git a/src/main/java/com/inmybook/error/exception/PostDeletionFailedException.java b/src/main/java/com/inmybook/error/exception/PostDeletionFailedException.java new file mode 100644 index 0000000..a1cbc22 --- /dev/null +++ b/src/main/java/com/inmybook/error/exception/PostDeletionFailedException.java @@ -0,0 +1,12 @@ +package com.inmybook.error.exception; + +import com.inmybook.error.ErrorCode; + +import lombok.Getter; + +@Getter +public class PostDeletionFailedException extends InMyBookException { + public PostDeletionFailedException(ErrorCode errorCode) { + super(errorCode); + } +} diff --git a/src/main/java/com/inmybook/error/exception/PostModificationFailedException.java b/src/main/java/com/inmybook/error/exception/PostModificationFailedException.java new file mode 100644 index 0000000..20a7aff --- /dev/null +++ b/src/main/java/com/inmybook/error/exception/PostModificationFailedException.java @@ -0,0 +1,12 @@ +package com.inmybook.error.exception; + +import com.inmybook.error.ErrorCode; + +import lombok.Getter; + +@Getter +public class PostModificationFailedException extends InMyBookException { + public PostModificationFailedException(ErrorCode errorCode) { + super(errorCode); + } +} diff --git a/src/main/java/com/inmybook/error/exception/PostNotFoundException.java b/src/main/java/com/inmybook/error/exception/PostNotFoundException.java new file mode 100644 index 0000000..1577cd5 --- /dev/null +++ b/src/main/java/com/inmybook/error/exception/PostNotFoundException.java @@ -0,0 +1,12 @@ +package com.inmybook.error.exception; + +import com.inmybook.error.ErrorCode; + +import lombok.Getter; + +@Getter +public class PostNotFoundException extends InMyBookException { + public PostNotFoundException(ErrorCode errorCode) { + super(errorCode); + } +} diff --git a/src/main/java/com/inmybook/error/exception/PostRegistrationFailedException.java b/src/main/java/com/inmybook/error/exception/PostRegistrationFailedException.java new file mode 100644 index 0000000..13aa674 --- /dev/null +++ b/src/main/java/com/inmybook/error/exception/PostRegistrationFailedException.java @@ -0,0 +1,12 @@ +package com.inmybook.error.exception; + +import com.inmybook.error.ErrorCode; + +import lombok.Getter; + +@Getter +public class PostRegistrationFailedException extends InMyBookException { + public PostRegistrationFailedException(ErrorCode errorCode) { + super(errorCode); + } +} From 630cf096c6f152484ca7e5b38b412d82dc762c50 Mon Sep 17 00:00:00 2001 From: dani820 Date: Sun, 29 Sep 2024 14:46:14 +0900 Subject: [PATCH 2/4] =?UTF-8?q?refactor:=20error=20code=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20Exception=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=9C=84=EC=B9=98=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/inmybook/adapter/out/InMemoryPostRepository.java | 4 +++- .../service}/exception/PostDeletionFailedException.java | 3 ++- .../exception/PostModificationFailedException.java | 3 ++- .../exception/PostRegistrationFailedException.java | 3 ++- src/main/java/com/inmybook/domain/post/PostFactory.java | 5 ++++- src/main/java/com/inmybook/error/ErrorCode.java | 8 ++++++-- .../java/com/inmybook/error/GlobalExceptionHandler.java | 6 +++--- 7 files changed, 22 insertions(+), 10 deletions(-) rename src/main/java/com/inmybook/{error => application/service}/exception/PostDeletionFailedException.java (67%) rename src/main/java/com/inmybook/{error => application/service}/exception/PostModificationFailedException.java (68%) rename src/main/java/com/inmybook/{error => application/service}/exception/PostRegistrationFailedException.java (68%) diff --git a/src/main/java/com/inmybook/adapter/out/InMemoryPostRepository.java b/src/main/java/com/inmybook/adapter/out/InMemoryPostRepository.java index de1044e..047f6f4 100644 --- a/src/main/java/com/inmybook/adapter/out/InMemoryPostRepository.java +++ b/src/main/java/com/inmybook/adapter/out/InMemoryPostRepository.java @@ -7,6 +7,8 @@ import com.inmybook.application.port.out.ReadPostPort; import com.inmybook.application.port.out.RegisterPostPort; import com.inmybook.domain.post.Post; +import com.inmybook.error.ErrorCode; +import com.inmybook.error.exception.PostNotFoundException; @Repository public class InMemoryPostRepository implements RegisterPostPort, ReadPostPort { @@ -27,6 +29,6 @@ public Post findPostById(String id) { return post; } } - throw new RuntimeException("독서록 정보를 찾을 수 없습니다."); + throw new PostNotFoundException(ErrorCode.POST_NOT_FOUND); } } diff --git a/src/main/java/com/inmybook/error/exception/PostDeletionFailedException.java b/src/main/java/com/inmybook/application/service/exception/PostDeletionFailedException.java similarity index 67% rename from src/main/java/com/inmybook/error/exception/PostDeletionFailedException.java rename to src/main/java/com/inmybook/application/service/exception/PostDeletionFailedException.java index a1cbc22..7ab1fbc 100644 --- a/src/main/java/com/inmybook/error/exception/PostDeletionFailedException.java +++ b/src/main/java/com/inmybook/application/service/exception/PostDeletionFailedException.java @@ -1,6 +1,7 @@ -package com.inmybook.error.exception; +package com.inmybook.application.service.exception; import com.inmybook.error.ErrorCode; +import com.inmybook.error.exception.InMyBookException; import lombok.Getter; diff --git a/src/main/java/com/inmybook/error/exception/PostModificationFailedException.java b/src/main/java/com/inmybook/application/service/exception/PostModificationFailedException.java similarity index 68% rename from src/main/java/com/inmybook/error/exception/PostModificationFailedException.java rename to src/main/java/com/inmybook/application/service/exception/PostModificationFailedException.java index 20a7aff..248158a 100644 --- a/src/main/java/com/inmybook/error/exception/PostModificationFailedException.java +++ b/src/main/java/com/inmybook/application/service/exception/PostModificationFailedException.java @@ -1,6 +1,7 @@ -package com.inmybook.error.exception; +package com.inmybook.application.service.exception; import com.inmybook.error.ErrorCode; +import com.inmybook.error.exception.InMyBookException; import lombok.Getter; diff --git a/src/main/java/com/inmybook/error/exception/PostRegistrationFailedException.java b/src/main/java/com/inmybook/application/service/exception/PostRegistrationFailedException.java similarity index 68% rename from src/main/java/com/inmybook/error/exception/PostRegistrationFailedException.java rename to src/main/java/com/inmybook/application/service/exception/PostRegistrationFailedException.java index 13aa674..616e161 100644 --- a/src/main/java/com/inmybook/error/exception/PostRegistrationFailedException.java +++ b/src/main/java/com/inmybook/application/service/exception/PostRegistrationFailedException.java @@ -1,6 +1,7 @@ -package com.inmybook.error.exception; +package com.inmybook.application.service.exception; import com.inmybook.error.ErrorCode; +import com.inmybook.error.exception.InMyBookException; import lombok.Getter; diff --git a/src/main/java/com/inmybook/domain/post/PostFactory.java b/src/main/java/com/inmybook/domain/post/PostFactory.java index 2ec2227..ddc42b6 100644 --- a/src/main/java/com/inmybook/domain/post/PostFactory.java +++ b/src/main/java/com/inmybook/domain/post/PostFactory.java @@ -6,7 +6,9 @@ import org.springframework.stereotype.Component; import com.inmybook.application.port.in.RegisterPostCommand; +import com.inmybook.application.service.exception.PostRegistrationFailedException; import com.inmybook.domain.member.Member; +import com.inmybook.error.ErrorCode; @Component public class PostFactory { @@ -19,7 +21,8 @@ public Post createPost(RegisterPostCommand registerPostCommand) { , registerPostCommand.thumbnailImg().getSize() , registerPostCommand.thumbnailImg().getBytes()); } catch (IOException e) { - throw new RuntimeException("독서록 게시글을 등록할 수 없습니다."); + // throw new RuntimeException("독서록 게시글을 등록할 수 없습니다."); + throw new PostRegistrationFailedException(ErrorCode.INVALID_PARAMETER); } } diff --git a/src/main/java/com/inmybook/error/ErrorCode.java b/src/main/java/com/inmybook/error/ErrorCode.java index 442cea2..6a77770 100644 --- a/src/main/java/com/inmybook/error/ErrorCode.java +++ b/src/main/java/com/inmybook/error/ErrorCode.java @@ -9,10 +9,14 @@ @RequiredArgsConstructor public enum ErrorCode { INVALID_REQUEST(HttpStatus.BAD_REQUEST, "잘못된 요청입니다."), + INVALID_REQUIRED_PARAMETER(HttpStatus.BAD_REQUEST, "필수 파라미터가 존재하지 않습니다."), NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 정보입니다."), - INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "서버 에러가 발생하였습니다."), + INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "서버 에러가 발생하였습니다. 다시 시도해주세요."), - POST_NOT_FOUND(HttpStatus.NOT_FOUND, "독서록 정보가 존재하지 않습니다."); + POST_NOT_FOUND(HttpStatus.NOT_FOUND, "독서록 정보가 존재하지 않습니다."), + POST_REGISTRATION_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "독서록 등록 중 문제가 발생했습니다. 다시 시도해주세요."), + POST_MODIFICATION_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "독서록 수정 중 문제가 발생했습니다. 다시 시도해주세요."), + POST_DELETION_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "독서록 삭제 중 문제가 발생했습니다. 다시 시도해주세요."); private final HttpStatus httpStatus; private final String message; diff --git a/src/main/java/com/inmybook/error/GlobalExceptionHandler.java b/src/main/java/com/inmybook/error/GlobalExceptionHandler.java index a6481dc..cecefb0 100644 --- a/src/main/java/com/inmybook/error/GlobalExceptionHandler.java +++ b/src/main/java/com/inmybook/error/GlobalExceptionHandler.java @@ -4,10 +4,10 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; -import com.inmybook.error.exception.PostDeletionFailedException; -import com.inmybook.error.exception.PostModificationFailedException; +import com.inmybook.application.service.exception.PostDeletionFailedException; +import com.inmybook.application.service.exception.PostModificationFailedException; +import com.inmybook.application.service.exception.PostRegistrationFailedException; import com.inmybook.error.exception.PostNotFoundException; -import com.inmybook.error.exception.PostRegistrationFailedException; import lombok.extern.slf4j.Slf4j; From 4985f83319f5b12b75b352effc1176db7fe7f995 Mon Sep 17 00:00:00 2001 From: dani820 Date: Sun, 29 Sep 2024 21:25:36 +0900 Subject: [PATCH 3/4] =?UTF-8?q?refactor:=20PostFactory=20=EB=82=B4=20IOExc?= =?UTF-8?q?eption=EC=97=90=20=EB=8C=80=ED=95=9C=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EB=AA=85=EB=AA=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/inmybook/domain/post/PostFactory.java | 11 +++++------ src/main/java/com/inmybook/error/ErrorCode.java | 4 +++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/inmybook/domain/post/PostFactory.java b/src/main/java/com/inmybook/domain/post/PostFactory.java index ddc42b6..c3f854a 100644 --- a/src/main/java/com/inmybook/domain/post/PostFactory.java +++ b/src/main/java/com/inmybook/domain/post/PostFactory.java @@ -16,13 +16,12 @@ public Post createPost(RegisterPostCommand registerPostCommand) { Thumbnail thumbnail = new Thumbnail(); if (registerPostCommand.thumbnailImg() != null) { try { - thumbnail = new Thumbnail(registerPostCommand.thumbnailImg().getName() - , registerPostCommand.thumbnailImg().getContentType() - , registerPostCommand.thumbnailImg().getSize() - , registerPostCommand.thumbnailImg().getBytes()); + thumbnail = new Thumbnail(registerPostCommand.thumbnailImg().getName(), + registerPostCommand.thumbnailImg().getContentType(), + registerPostCommand.thumbnailImg().getSize(), + registerPostCommand.thumbnailImg().getBytes()); } catch (IOException e) { - // throw new RuntimeException("독서록 게시글을 등록할 수 없습니다."); - throw new PostRegistrationFailedException(ErrorCode.INVALID_PARAMETER); + throw new PostRegistrationFailedException(ErrorCode.FILE_READ_ERROR); } } diff --git a/src/main/java/com/inmybook/error/ErrorCode.java b/src/main/java/com/inmybook/error/ErrorCode.java index 6a77770..38df9e2 100644 --- a/src/main/java/com/inmybook/error/ErrorCode.java +++ b/src/main/java/com/inmybook/error/ErrorCode.java @@ -16,7 +16,9 @@ public enum ErrorCode { POST_NOT_FOUND(HttpStatus.NOT_FOUND, "독서록 정보가 존재하지 않습니다."), POST_REGISTRATION_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "독서록 등록 중 문제가 발생했습니다. 다시 시도해주세요."), POST_MODIFICATION_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "독서록 수정 중 문제가 발생했습니다. 다시 시도해주세요."), - POST_DELETION_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "독서록 삭제 중 문제가 발생했습니다. 다시 시도해주세요."); + POST_DELETION_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "독서록 삭제 중 문제가 발생했습니다. 다시 시도해주세요."), + + FILE_READ_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "파일 읽기 작업 중 문제가 발생했습니다. 다시 시도해주세요."); private final HttpStatus httpStatus; private final String message; From a76074dfa4b012d6defbcf309e766b8536be7d71 Mon Sep 17 00:00:00 2001 From: dani820 Date: Mon, 30 Sep 2024 23:08:42 +0900 Subject: [PATCH 4/4] =?UTF-8?q?refactor:=20Spring=20MVC=20=EA=B8=B0?= =?UTF-8?q?=EB=B3=B8=20=EC=97=90=EB=9F=AC=EC=B2=98=EB=A6=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/inmybook/error/ErrorCode.java | 4 +++ .../error/GlobalExceptionHandler.java | 36 +++++++++++++++++++ .../exception/UnauthorizedException.java | 11 ++++++ src/main/resources/application.yml | 5 ++- 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/inmybook/error/exception/UnauthorizedException.java diff --git a/src/main/java/com/inmybook/error/ErrorCode.java b/src/main/java/com/inmybook/error/ErrorCode.java index 38df9e2..6ce6d5c 100644 --- a/src/main/java/com/inmybook/error/ErrorCode.java +++ b/src/main/java/com/inmybook/error/ErrorCode.java @@ -10,7 +10,11 @@ public enum ErrorCode { INVALID_REQUEST(HttpStatus.BAD_REQUEST, "잘못된 요청입니다."), INVALID_REQUIRED_PARAMETER(HttpStatus.BAD_REQUEST, "필수 파라미터가 존재하지 않습니다."), + UNAUTHORIZED_ACCESS(HttpStatus.UNAUTHORIZED, "리소스에 접근하려면 인증이 필요합니다."), + FORBIDDEN_ACCESS(HttpStatus.FORBIDDEN, "접근 권한이 없습니다."), NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 정보입니다."), + NOT_FOUND_HTTP_METHOD(HttpStatus.NOT_FOUND, "존재하지 않는 HTTP 메소드입니다."), + NOT_ALLOWED_HTTP_METHOD(HttpStatus.METHOD_NOT_ALLOWED, "허용되지 않는 HTTP 메소드입니다."), INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "서버 에러가 발생하였습니다. 다시 시도해주세요."), POST_NOT_FOUND(HttpStatus.NOT_FOUND, "독서록 정보가 존재하지 않습니다."), diff --git a/src/main/java/com/inmybook/error/GlobalExceptionHandler.java b/src/main/java/com/inmybook/error/GlobalExceptionHandler.java index cecefb0..e9ce1aa 100644 --- a/src/main/java/com/inmybook/error/GlobalExceptionHandler.java +++ b/src/main/java/com/inmybook/error/GlobalExceptionHandler.java @@ -1,19 +1,55 @@ package com.inmybook.error; +import java.nio.file.AccessDeniedException; + import org.springframework.http.ResponseEntity; +import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.NoHandlerFoundException; import com.inmybook.application.service.exception.PostDeletionFailedException; import com.inmybook.application.service.exception.PostModificationFailedException; import com.inmybook.application.service.exception.PostRegistrationFailedException; import com.inmybook.error.exception.PostNotFoundException; +import com.inmybook.error.exception.UnauthorizedException; import lombok.extern.slf4j.Slf4j; @Slf4j @RestControllerAdvice public class GlobalExceptionHandler { + @ExceptionHandler(UnauthorizedException.class) + protected ResponseEntity handleUnauthorizedException( + UnauthorizedException ex) { + log.error("handleUnauthorizedException", ex); + ErrorCode errorCode = ErrorCode.UNAUTHORIZED_ACCESS; + return ErrorResponseDto.error(errorCode); + } + + @ExceptionHandler(AccessDeniedException.class) + protected ResponseEntity handleAccessDeniedException( + AccessDeniedException ex) { + log.error("handleAccessDeniedException", ex); + ErrorCode errorCode = ErrorCode.FORBIDDEN_ACCESS; + return ErrorResponseDto.error(errorCode); + } + + @ExceptionHandler(NoHandlerFoundException.class) + protected ResponseEntity handleNoHandlerFoundException( + NoHandlerFoundException ex) { + log.error("handleNoHandlerFoundException", ex); + ErrorCode errorCode = ErrorCode.NOT_FOUND_HTTP_METHOD; + return ErrorResponseDto.error(errorCode); + } + + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + protected ResponseEntity handleHttpRequestMethodNotSupportedException( + HttpRequestMethodNotSupportedException ex) { + log.error("handleHttpRequestMethodNotSupportedException", ex); + ErrorCode errorCode = ErrorCode.NOT_ALLOWED_HTTP_METHOD; + return ErrorResponseDto.error(errorCode); + } @ExceptionHandler(PostModificationFailedException.class) protected ResponseEntity handlePostModificationFailedException( diff --git a/src/main/java/com/inmybook/error/exception/UnauthorizedException.java b/src/main/java/com/inmybook/error/exception/UnauthorizedException.java new file mode 100644 index 0000000..6468ce6 --- /dev/null +++ b/src/main/java/com/inmybook/error/exception/UnauthorizedException.java @@ -0,0 +1,11 @@ +package com.inmybook.error.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.UNAUTHORIZED) +public class UnauthorizedException extends RuntimeException { + public UnauthorizedException(String message) { + super(message); + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index bec4faf..cfb3617 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,6 +1,9 @@ spring: application: name: inmybook + web: + resources: + add-mappings: false springdoc: api-docs: path: /api-docs @@ -12,4 +15,4 @@ springdoc: path: /swagger-ui.html disable-swagger-default-url: true display-query-params-without-oauth2: true - doc-expansion: none + doc-expansion: none \ No newline at end of file