From 051b37c4b3c0eae3f4f1c2cc42cdfcdfd1d683b4 Mon Sep 17 00:00:00 2001 From: Adam Saghy Date: Tue, 20 Feb 2024 14:24:16 +0100 Subject: [PATCH] FINERACT-1971: Enhanced error logging: Optimistic lock exception handling + log most specific exception --- .../core/exception/ErrorHandler.java | 20 ++++++- ...HttpMessageNotReadableErrorController.java | 2 +- .../AccessDeniedExceptionMapper.java | 3 +- .../BadCredentialsExceptionMapper.java | 3 +- .../BusinessStepExceptionMapper.java | 3 +- ...essStepNotBelongsToJobExceptionMapper.java | 3 +- .../ConcurrencyFailureExceptionMapper.java | 3 +- .../DefaultExceptionMapper.java | 3 +- .../IdempotentCommandExceptionMapper.java | 3 +- ...alidInstanceTypeMethodExceptionMapper.java | 3 +- .../InvalidJsonExceptionMapper.java | 3 +- ...nvalidTenantIdentifierExceptionMapper.java | 3 +- .../JakartaOptimisticLockExceptionMapper.java | 56 +++++++++++++++++++ ...IsNotFoundOrNotEnabledExceptionMapper.java | 3 +- .../JpaOptimisticLockExceptionMapper.java | 56 +++++++++++++++++++ .../JsonPathExceptionMapper.java | 3 +- .../JsonSyntaxExceptionMapper.java | 3 +- .../MalformedJsonExceptionMapper.java | 3 +- .../NoAuthorizationExceptionMapper.java | 3 +- .../OAuth2ExceptionEntryPoint.java | 3 +- .../OptimisticLockExceptionMapper.java | 5 +- ...tformApiDataValidationExceptionMapper.java | 3 +- .../PlatformDataIntegrityExceptionMapper.java | 3 +- .../PlatformDomainRuleExceptionMapper.java | 3 +- ...PlatformInternalServerExceptionMapper.java | 3 +- ...odyItemLimitValidationExceptionMapper.java | 3 +- ...atformResourceNotFoundExceptionMapper.java | 3 +- ...formServiceUnavailableExceptionMapper.java | 3 +- ...TransactionNotApprovedExceptionMapper.java | 3 +- .../UnAuthenticatedUserExceptionMapper.java | 3 +- ...UnrecognizedQueryParamExceptionMapper.java | 3 +- .../UnsupportedCommandExceptionMapper.java | 3 +- .../UnsupportedParameterExceptionMapper.java | 3 +- ...tOwnerInitiateTransferExceptionMapper.java | 3 +- .../LinkedAccountRequiredExceptionMapper.java | 2 +- .../LoanIdsHardLockedExceptionMapper.java | 2 +- ...sbursementDataRequiredExceptionMapper.java | 2 +- ...tLockCannotBeOverruledExceptionMapper.java | 3 +- .../src/main/resources/application.properties | 6 +- 39 files changed, 198 insertions(+), 43 deletions(-) create mode 100644 fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JakartaOptimisticLockExceptionMapper.java create mode 100644 fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JpaOptimisticLockExceptionMapper.java diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/ErrorHandler.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/ErrorHandler.java index 4ce0e98a8..f6ffb431c 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/ErrorHandler.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/ErrorHandler.java @@ -44,6 +44,7 @@ import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.exceptionmapper.DefaultExceptionMapper; import org.apache.fineract.infrastructure.core.exceptionmapper.FineractExceptionMapper; import org.apache.fineract.infrastructure.core.serialization.GoogleGsonSerializerHelper; +import org.eclipse.persistence.exceptions.OptimisticLockException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.core.NestedRuntimeException; @@ -177,12 +178,17 @@ public final class ErrorHandler { if (nre instanceof NonTransientDataAccessException) { msgCode = msgCode == null ? codePfx + ".data.integrity.issue" : msgCode; return new PlatformDataIntegrityException(msgCode, msg, param, args); + } else if (cause instanceof OptimisticLockException) { + return (RuntimeException) cause; } } if (t instanceof ValidationException) { msgCode = msgCode == null ? codePfx + ".validation.error" : msgCode; return new PlatformApiDataValidationException(List.of(ApiParameterError.parameterError(msgCode, msg, param, defaultMsgArgs))); } + if (t instanceof jakarta.persistence.OptimisticLockException) { + return (RuntimeException) t; + } if (t instanceof PersistenceException) { msgCode = msgCode == null ? codePfx + ".persistence.error" : msgCode; return new PlatformDataIntegrityException(msgCode, msg, param, args); @@ -191,13 +197,13 @@ public final class ErrorHandler { msgCode = msgCode == null ? codePfx + ".authentication.error" : msgCode; return new PlatformDataIntegrityException(msgCode, msg, param, args); } - if (t instanceof RuntimeException re) { - return re; - } if (t instanceof ParseException) { msgCode = msgCode == null ? codePfx + ".parse.error" : msgCode; return new PlatformDataIntegrityException(msgCode, msg, param, args); } + if (t instanceof RuntimeException re) { + return re; + } return new RuntimeException(msg, t); } @@ -208,4 +214,12 @@ public final class ErrorHandler { return Set.of(array); } } + + public static Throwable findMostSpecificException(Exception exception) { + Throwable mostSpecificException = exception; + while (mostSpecificException.getCause() != null) { + mostSpecificException = mostSpecificException.getCause(); + } + return mostSpecificException; + } } diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/HttpMessageNotReadableErrorController.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/HttpMessageNotReadableErrorController.java index bf04e8df6..8bd56c399 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/HttpMessageNotReadableErrorController.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/HttpMessageNotReadableErrorController.java @@ -39,7 +39,7 @@ public class HttpMessageNotReadableErrorController implements ExceptionMapper { + + @Override + public Response toResponse(final OptimisticLockException exception) { + log.warn("Exception occurred", ErrorHandler.findMostSpecificException(exception)); + String type = "optimistic lock"; + String identifier = "unknown"; + final ApiGlobalErrorResponse dataIntegrityError = ApiGlobalErrorResponse.conflict(type, identifier); + return Response.status(SC_CONFLICT).entity(dataIntegrityError).type(MediaType.APPLICATION_JSON).build(); + } + + @Override + public int errorCode() { + return 4019; + } +} diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JobIsNotFoundOrNotEnabledExceptionMapper.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JobIsNotFoundOrNotEnabledExceptionMapper.java index 73b71b3e8..2ff0be66c 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JobIsNotFoundOrNotEnabledExceptionMapper.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JobIsNotFoundOrNotEnabledExceptionMapper.java @@ -24,6 +24,7 @@ import jakarta.ws.rs.ext.ExceptionMapper; import jakarta.ws.rs.ext.Provider; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.data.ApiGlobalErrorResponse; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.JobIsNotFoundOrNotEnabledException; import org.springframework.stereotype.Component; @@ -34,7 +35,7 @@ public class JobIsNotFoundOrNotEnabledExceptionMapper implements ExceptionMapper @Override public Response toResponse(JobIsNotFoundOrNotEnabledException exception) { - log.warn("Exception occurred", exception); + log.warn("Exception occurred", ErrorHandler.findMostSpecificException(exception)); return Response.status(Response.Status.FORBIDDEN) .entity(ApiGlobalErrorResponse.jobIsDisabled(exception.getGlobalisationMessageCode(), exception.getDefaultUserMessage())) .type(MediaType.APPLICATION_JSON).build(); diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JpaOptimisticLockExceptionMapper.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JpaOptimisticLockExceptionMapper.java new file mode 100644 index 000000000..a236c44f2 --- /dev/null +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JpaOptimisticLockExceptionMapper.java @@ -0,0 +1,56 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.infrastructure.core.exceptionmapper; + +import static org.apache.http.HttpStatus.SC_CONFLICT; + +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.ExceptionMapper; +import jakarta.ws.rs.ext.Provider; +import lombok.extern.slf4j.Slf4j; +import org.apache.fineract.infrastructure.core.data.ApiGlobalErrorResponse; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; +import org.springframework.orm.ObjectOptimisticLockingFailureException; +import org.springframework.orm.jpa.JpaOptimisticLockingFailureException; +import org.springframework.stereotype.Component; + +/** + * An {@link ExceptionMapper} to map {@link ObjectOptimisticLockingFailureException} thrown by platform into a HTTP API + * friendly format. + */ +@Provider +@Component +@Slf4j +public class JpaOptimisticLockExceptionMapper implements FineractExceptionMapper, ExceptionMapper { + + @Override + public Response toResponse(final JpaOptimisticLockingFailureException exception) { + log.warn("Exception occurred", ErrorHandler.findMostSpecificException(exception)); + String type = "optimistic lock"; + String identifier = "unknown"; + final ApiGlobalErrorResponse dataIntegrityError = ApiGlobalErrorResponse.conflict(type, identifier); + return Response.status(SC_CONFLICT).entity(dataIntegrityError).type(MediaType.APPLICATION_JSON).build(); + } + + @Override + public int errorCode() { + return 4019; + } +} diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JsonPathExceptionMapper.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JsonPathExceptionMapper.java index 3ce0affde..7f8da34a2 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JsonPathExceptionMapper.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JsonPathExceptionMapper.java @@ -25,6 +25,7 @@ import jakarta.ws.rs.ext.ExceptionMapper; import jakarta.ws.rs.ext.Provider; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.data.ApiParameterError; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -38,7 +39,7 @@ public class JsonPathExceptionMapper implements ExceptionMapper { @Override public Response toResponse(final OptimisticLockException exception) { - log.warn("Exception occurred", exception); + log.warn("Exception occurred", ErrorHandler.findMostSpecificException(exception)); String type = exception.getQuery() == null ? "unknown" : "query"; String identifier = "unknown"; final ApiGlobalErrorResponse dataIntegrityError = ApiGlobalErrorResponse.conflict(type, identifier); diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformApiDataValidationExceptionMapper.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformApiDataValidationExceptionMapper.java index 0fb62b182..707bb8419 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformApiDataValidationExceptionMapper.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformApiDataValidationExceptionMapper.java @@ -25,6 +25,7 @@ import jakarta.ws.rs.ext.ExceptionMapper; import jakarta.ws.rs.ext.Provider; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.data.ApiGlobalErrorResponse; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -45,7 +46,7 @@ public class PlatformApiDataValidationExceptionMapper @Override public Response toResponse(final PlatformApiDataValidationException exception) { - log.warn("Exception occurred", exception); + log.warn("Exception occurred", ErrorHandler.findMostSpecificException(exception)); final ApiGlobalErrorResponse dataValidationErrorResponse = ApiGlobalErrorResponse .badClientRequest(exception.getGlobalisationMessageCode(), exception.getDefaultUserMessage(), exception.getErrors()); diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformDataIntegrityExceptionMapper.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformDataIntegrityExceptionMapper.java index 54e6a2b30..d67d3c59a 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformDataIntegrityExceptionMapper.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformDataIntegrityExceptionMapper.java @@ -25,6 +25,7 @@ import jakarta.ws.rs.ext.ExceptionMapper; import jakarta.ws.rs.ext.Provider; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.data.ApiGlobalErrorResponse; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -44,7 +45,7 @@ public class PlatformDataIntegrityExceptionMapper implements FineractExceptionMa @Override public Response toResponse(final PlatformDataIntegrityException exception) { - log.warn("Exception occurred", exception); + log.warn("Exception occurred", ErrorHandler.findMostSpecificException(exception)); final ApiGlobalErrorResponse dataIntegrityError = ApiGlobalErrorResponse.dataIntegrityError(exception.getGlobalisationMessageCode(), exception.getDefaultUserMessage(), exception.getParameterName(), exception.getDefaultUserMessageArgs()); diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformDomainRuleExceptionMapper.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformDomainRuleExceptionMapper.java index 9b7fac95e..721bb4984 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformDomainRuleExceptionMapper.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformDomainRuleExceptionMapper.java @@ -26,6 +26,7 @@ import jakarta.ws.rs.ext.Provider; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.data.ApiGlobalErrorResponse; import org.apache.fineract.infrastructure.core.exception.AbstractPlatformDomainRuleException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -44,7 +45,7 @@ public class PlatformDomainRuleExceptionMapper implements FineractExceptionMappe @Override public Response toResponse(final AbstractPlatformDomainRuleException exception) { - log.warn("Exception occurred", exception); + log.warn("Exception occurred", ErrorHandler.findMostSpecificException(exception)); final ApiGlobalErrorResponse notFoundErrorResponse = ApiGlobalErrorResponse.domainRuleViolation( exception.getGlobalisationMessageCode(), exception.getDefaultUserMessage(), exception.getDefaultUserMessageArgs()); // request understood but not carried out due to it violating some diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformInternalServerExceptionMapper.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformInternalServerExceptionMapper.java index e0231f097..68f551b0c 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformInternalServerExceptionMapper.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformInternalServerExceptionMapper.java @@ -25,6 +25,7 @@ import jakarta.ws.rs.ext.ExceptionMapper; import jakarta.ws.rs.ext.Provider; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.data.ApiGlobalErrorResponse; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformInternalServerException; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -43,7 +44,7 @@ public class PlatformInternalServerExceptionMapper implements FineractExceptionM @Override public Response toResponse(final PlatformInternalServerException exception) { - log.warn("Exception occurred", exception); + log.warn("Exception occurred", ErrorHandler.findMostSpecificException(exception)); final ApiGlobalErrorResponse notFoundErrorResponse = ApiGlobalErrorResponse.serverSideError(exception.getGlobalisationMessageCode(), exception.getDefaultUserMessage(), exception.getDefaultUserMessageArgs()); return Response.status(Status.INTERNAL_SERVER_ERROR).entity(notFoundErrorResponse).type(MediaType.APPLICATION_JSON).build(); diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformRequestBodyItemLimitValidationExceptionMapper.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformRequestBodyItemLimitValidationExceptionMapper.java index c0a875c6a..4e67cb356 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformRequestBodyItemLimitValidationExceptionMapper.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformRequestBodyItemLimitValidationExceptionMapper.java @@ -24,6 +24,7 @@ import jakarta.ws.rs.ext.ExceptionMapper; import jakarta.ws.rs.ext.Provider; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.data.ApiGlobalErrorResponse; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformRequestBodyItemLimitValidationException; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -38,7 +39,7 @@ public class PlatformRequestBodyItemLimitValidationExceptionMapper @Override public Response toResponse(PlatformRequestBodyItemLimitValidationException exception) { String globalisationMessage = "error.msg.validation.request.body.item.limit.validation"; - log.warn("Exception occurred", exception); + log.warn("Exception occurred", ErrorHandler.findMostSpecificException(exception)); final ApiGlobalErrorResponse badRequestErrorResponse = ApiGlobalErrorResponse.badClientRequest(globalisationMessage, exception.getMessage()); return Response.status(Response.Status.BAD_REQUEST).entity(badRequestErrorResponse).type(MediaType.APPLICATION_JSON).build(); diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformResourceNotFoundExceptionMapper.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformResourceNotFoundExceptionMapper.java index 56ba36497..bbdc0053b 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformResourceNotFoundExceptionMapper.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformResourceNotFoundExceptionMapper.java @@ -26,6 +26,7 @@ import jakarta.ws.rs.ext.Provider; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.data.ApiGlobalErrorResponse; import org.apache.fineract.infrastructure.core.exception.AbstractPlatformResourceNotFoundException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -45,7 +46,7 @@ public class PlatformResourceNotFoundExceptionMapper @Override public Response toResponse(final AbstractPlatformResourceNotFoundException exception) { - log.warn("Exception occurred", exception); + log.warn("Exception occurred", ErrorHandler.findMostSpecificException(exception)); final ApiGlobalErrorResponse notFoundErrorResponse = ApiGlobalErrorResponse.notFound(exception.getGlobalisationMessageCode(), exception.getDefaultUserMessage(), exception.getDefaultUserMessageArgs()); return Response.status(Status.NOT_FOUND).entity(notFoundErrorResponse).type(MediaType.APPLICATION_JSON).build(); diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformServiceUnavailableExceptionMapper.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformServiceUnavailableExceptionMapper.java index 38f4074b2..6248dc1d6 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformServiceUnavailableExceptionMapper.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/PlatformServiceUnavailableExceptionMapper.java @@ -26,6 +26,7 @@ import jakarta.ws.rs.ext.Provider; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.data.ApiGlobalErrorResponse; import org.apache.fineract.infrastructure.core.exception.AbstractPlatformServiceUnavailableException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -45,7 +46,7 @@ public class PlatformServiceUnavailableExceptionMapper implements ExceptionMappe @Override public Response toResponse(final AbstractPlatformServiceUnavailableException exception) { - log.warn("Exception occurred", exception); + log.warn("Exception occurred", ErrorHandler.findMostSpecificException(exception)); final ApiGlobalErrorResponse serviceUnavailableExceptionResponse = ApiGlobalErrorResponse.serviceUnavailable( exception.getGlobalisationMessageCode(), exception.getDefaultUserMessage(), exception.getDefaultUserMessageArgs()); return Response.status(Status.SERVICE_UNAVAILABLE).entity(serviceUnavailableExceptionResponse).type(MediaType.APPLICATION_JSON) diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/RollbackTransactionNotApprovedExceptionMapper.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/RollbackTransactionNotApprovedExceptionMapper.java index 33087afbe..93f8b29d6 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/RollbackTransactionNotApprovedExceptionMapper.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/RollbackTransactionNotApprovedExceptionMapper.java @@ -25,6 +25,7 @@ import jakarta.ws.rs.ext.ExceptionMapper; import jakarta.ws.rs.ext.Provider; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.commands.exception.RollbackTransactionNotApprovedException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -45,7 +46,7 @@ public class RollbackTransactionNotApprovedExceptionMapper @Override public Response toResponse(final RollbackTransactionNotApprovedException exception) { - log.warn("Exception occurred", exception); + log.warn("Exception occurred", ErrorHandler.findMostSpecificException(exception)); return Response.ok().entity(new Gson().toJson(exception.getResult())).type(MediaType.APPLICATION_JSON).build(); } diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/UnAuthenticatedUserExceptionMapper.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/UnAuthenticatedUserExceptionMapper.java index 0f979f01c..2d9b00a25 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/UnAuthenticatedUserExceptionMapper.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/UnAuthenticatedUserExceptionMapper.java @@ -25,6 +25,7 @@ import jakarta.ws.rs.ext.ExceptionMapper; import jakarta.ws.rs.ext.Provider; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.data.ApiGlobalErrorResponse; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.useradministration.exception.UnAuthenticatedUserException; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -42,7 +43,7 @@ public class UnAuthenticatedUserExceptionMapper implements ExceptionMapper