From 86b2dd896cd67b5e209a7a0b3a3eca8c728fa51f Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 22 Aug 2024 15:37:33 +0530 Subject: [PATCH] added new exception in global exception handler --- pom.xml | 7 +- .../api/errors/BadRequestAlertException.java | 28 ++++++ .../api/errors/ForbiddenAccessException.java | 23 +++++ .../api/errors/GlobalExceptionHandler.java | 98 ++++++++++++++++++- .../errors/UnauthorizedAccessException.java | 23 +++++ src/main/resources/message_en.properties | 7 ++ src/main/resources/message_it.properties | 6 +- 7 files changed, 186 insertions(+), 6 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/BadRequestAlertException.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ForbiddenAccessException.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/UnauthorizedAccessException.java diff --git a/pom.xml b/pom.xml index 1b55d803..713de99a 100644 --- a/pom.xml +++ b/pom.xml @@ -132,10 +132,13 @@ com.google.code.gson gson - 2.10.1 - + + org.zalando + problem-spring-web + 0.23.0 + diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/BadRequestAlertException.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/BadRequestAlertException.java new file mode 100644 index 00000000..c8e6abc9 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/BadRequestAlertException.java @@ -0,0 +1,28 @@ +package net.gepafin.tendermanagement.web.rest.api.errors; + +import org.zalando.problem.AbstractThrowableProblem; +import org.zalando.problem.Status; + +import java.net.URI; +import java.util.HashMap; +import java.util.Map; + +public class BadRequestAlertException extends AbstractThrowableProblem { + + private static final long serialVersionUID = 1L; + + public BadRequestAlertException(String defaultMessage, String entityName, String errorKey) { + this(ErrorConstants.DEFAULT_TYPE, defaultMessage, entityName, errorKey); + } + + public BadRequestAlertException(URI type, String defaultMessage, String entityName, String errorKey) { + super(type, defaultMessage, Status.BAD_REQUEST, null, null, null, getAlertParameters(entityName, errorKey)); + } + + private static Map getAlertParameters(String entityName, String errorKey) { + Map parameters = new HashMap<>(); + parameters.put("message", "error." + errorKey); + parameters.put("params", entityName); + return parameters; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ForbiddenAccessException.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ForbiddenAccessException.java new file mode 100644 index 00000000..9b448f6a --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ForbiddenAccessException.java @@ -0,0 +1,23 @@ +package net.gepafin.tendermanagement.web.rest.api.errors; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(value = HttpStatus.FORBIDDEN) +public class ForbiddenAccessException extends RuntimeException { + + /** + * + */ + private static final long serialVersionUID = 1L; + private final Status status; + + public ForbiddenAccessException(Status status, String message) { + super(message); + this.status = status; + } + + public Status getStatus() { + return status; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java index 6a6b00ef..bf5d7123 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java @@ -1,18 +1,37 @@ package net.gepafin.tendermanagement.web.rest.api.errors; +import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.model.util.Response; + +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.core.AuthenticationException; +import org.springframework.validation.FieldError; +import org.springframework.validation.ObjectError; @ControllerAdvice public class GlobalExceptionHandler { + + public final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + @ResponseStatus(value = HttpStatus.BAD_REQUEST) @ExceptionHandler(CustomValidationException.class) - public ResponseEntity> handleCustomValidationException(CustomValidationException ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST) - .body(new Response<>(null, ex.getStatus(), ex.getMessage())); + @ResponseBody + public Response handleCustomValidationException(final CustomValidationException ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + return new Response<>(null, ex.getStatus(), ex.getMessage()); } @ExceptionHandler(ResourceNotFoundException.class) @@ -20,4 +39,77 @@ public class GlobalExceptionHandler { return ResponseEntity.status(HttpStatus.NOT_FOUND) .body(new Response<>(null, ex.getStatus(), ex.getMessage())); } + + @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(Exception.class) + @ResponseBody + public Response handleThrowable(final Throwable ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + return new Response<>(null, Status.EXCEPTION_ERROR, Translator.toLocale("common_message")); + } + + @ResponseStatus(value = HttpStatus.UNAUTHORIZED) + @ExceptionHandler(AuthenticationException.class) + @ResponseBody + public Response handleInvalidTokenException(final Throwable ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + return new Response<>(ex.getMessage(), Status.UNAUTHORIZED, Translator.toLocale("invalid_signature")); + } + + @ResponseStatus(value = HttpStatus.UNAUTHORIZED) + @ExceptionHandler(UnauthorizedAccessException.class) + @ResponseBody + public Response unauthorizedAccessException(final Throwable ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + return new Response<>(null, Status.UNAUTHORIZED, ex.getMessage()); + } + + @ResponseStatus(value = HttpStatus.FORBIDDEN) + @ExceptionHandler(ForbiddenAccessException.class) + @ResponseBody + public Response forbiddenAccessException(final Throwable ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + return new Response<>(null, Status.FORBIDDEN, ex.getMessage()); + } + + @ResponseStatus(value = HttpStatus.BAD_REQUEST) + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseBody + public Response handleValiationException(final MethodArgumentNotValidException ex) { + + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + final List errors = new ArrayList(); + for (final FieldError error : ex.getBindingResult().getFieldErrors()) { + errors.add(error.getField() + ": " + error.getDefaultMessage()); + } + for (final ObjectError error : ex.getBindingResult().getGlobalErrors()) { + errors.add(error.getObjectName() + ": " + error.getDefaultMessage()); + } + return new Response<>(errors, Status.VALIDATION_ERROR, Translator.toLocale("req_validation_er")); + } + + @ResponseStatus(value = HttpStatus.UNAUTHORIZED) + @ExceptionHandler(BadCredentialsException.class) + @ResponseBody + public Response handleUnAuthorizedException(final Throwable ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + return new Response<>(null, Status.VALIDATION_ERROR, Translator.toLocale("invalid_login")); + } + + @ResponseStatus(value = HttpStatus.BAD_REQUEST) + @ExceptionHandler(BadRequestAlertException.class) + @ResponseBody + public Response badRequestAlertException(final Throwable ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + return new Response<>(null, Status.EXCEPTION_ERROR, ex.getMessage()); + } + + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/UnauthorizedAccessException.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/UnauthorizedAccessException.java new file mode 100644 index 00000000..34f1b5ef --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/UnauthorizedAccessException.java @@ -0,0 +1,23 @@ +package net.gepafin.tendermanagement.web.rest.api.errors; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(value = HttpStatus.UNAUTHORIZED) +public class UnauthorizedAccessException extends RuntimeException { + + /** + * + */ + private static final long serialVersionUID = 1L; + private final Status status; + + public UnauthorizedAccessException(Status status, String message) { + super(message); + this.status = status; + } + + public Status getStatus() { + return status; + } +} diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 1960099c..1c9cc13b 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -48,6 +48,13 @@ login.successfully=Login successfully. pass.min.len.msg=Password must be at least 8 characters long. email.already.exists=A user with this email already exists. +#Global messages +common_message=Something went wrong..Please try again.. +invalid_signature=Invalid token. +invalid_login=Invalid username or password. +req_validation_er=Request Validation Error + + diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 4ed41cc8..326c7329 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -48,4 +48,8 @@ login.successfully=Accesso effettuato con successo. pass.min.len.msg=La password deve essere lunga almeno 8 caratteri. email.already.exists=Esiste gi� un utente con questa email. - +#Global messages +common_message=qualcosa é andato storto. Per favore riprova +invalid_signature=Gettone non valido. +invalid_login=Nome utente o password errati +req_validation_er=Errore di convalida