This is an automated email from the ASF dual-hosted git repository.

arnold pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new 23e00ffec FINERACT-1971: Enhanced error logging - Attach stacktrace
23e00ffec is described below

commit 23e00ffec95e8ae3a04d7af2b5836d29fd8aa0a1
Author: Adam Saghy <[email protected]>
AuthorDate: Mon Feb 19 19:09:40 2024 +0100

    FINERACT-1971: Enhanced error logging - Attach stacktrace
---
 .../core/exception/HttpMessageNotReadableErrorController.java      | 2 +-
 .../core/exceptionmapper/AccessDeniedExceptionMapper.java          | 2 +-
 .../core/exceptionmapper/BadCredentialsExceptionMapper.java        | 2 +-
 .../core/exceptionmapper/BusinessStepExceptionMapper.java          | 2 +-
 .../BusinessStepNotBelongsToJobExceptionMapper.java                | 2 +-
 .../core/exceptionmapper/ConcurrencyFailureExceptionMapper.java    | 2 +-
 .../core/exceptionmapper/DefaultExceptionMapper.java               | 5 +++--
 .../core/exceptionmapper/IdempotentCommandExceptionMapper.java     | 2 +-
 .../exceptionmapper/InvalidInstanceTypeMethodExceptionMapper.java  | 2 +-
 .../core/exceptionmapper/InvalidJsonExceptionMapper.java           | 2 +-
 .../exceptionmapper/InvalidTenantIdentifierExceptionMapper.java    | 2 +-
 .../exceptionmapper/JobIsNotFoundOrNotEnabledExceptionMapper.java  | 2 +-
 .../core/exceptionmapper/JsonPathExceptionMapper.java              | 2 +-
 .../core/exceptionmapper/JsonSyntaxExceptionMapper.java            | 2 +-
 .../core/exceptionmapper/MalformedJsonExceptionMapper.java         | 2 +-
 .../core/exceptionmapper/NoAuthorizationExceptionMapper.java       | 2 +-
 .../core/exceptionmapper/OAuth2ExceptionEntryPoint.java            | 7 +++----
 .../core/exceptionmapper/OptimisticLockExceptionMapper.java        | 2 +-
 .../exceptionmapper/PlatformApiDataValidationExceptionMapper.java  | 2 +-
 .../core/exceptionmapper/PlatformDataIntegrityExceptionMapper.java | 2 +-
 .../core/exceptionmapper/PlatformDomainRuleExceptionMapper.java    | 2 +-
 .../exceptionmapper/PlatformInternalServerExceptionMapper.java     | 2 +-
 .../PlatformRequestBodyItemLimitValidationExceptionMapper.java     | 2 +-
 .../exceptionmapper/PlatformResourceNotFoundExceptionMapper.java   | 2 +-
 .../exceptionmapper/PlatformServiceUnavailableExceptionMapper.java | 2 +-
 .../RollbackTransactionNotApprovedExceptionMapper.java             | 2 +-
 .../core/exceptionmapper/UnAuthenticatedUserExceptionMapper.java   | 2 +-
 .../exceptionmapper/UnrecognizedQueryParamExceptionMapper.java     | 2 +-
 .../core/exceptionmapper/UnsupportedCommandExceptionMapper.java    | 2 +-
 .../core/exceptionmapper/UnsupportedParameterExceptionMapper.java  | 2 +-
 .../ExternalAssetOwnerInitiateTransferExceptionMapper.java         | 2 +-
 .../core/exception/LinkedAccountRequiredExceptionMapper.java       | 2 +-
 .../core/exception/LoanIdsHardLockedExceptionMapper.java           | 1 +
 .../exception/MultiDisbursementDataRequiredExceptionMapper.java    | 2 +-
 .../LoanAccountLockCannotBeOverruledExceptionMapper.java           | 2 +-
 35 files changed, 39 insertions(+), 38 deletions(-)

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 2449ad4ca..bf04e8df6 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<Ht
     public Response toResponse(HttpMessageNotReadableException exception) {
         final String globalisationMessageCode = "error.msg.invalid.json.data";
         final String defaultUserMessage = "The referenced JSON data is 
invalid, validate date format as yyyy-MM-dd or other cases like String instead 
of Number";
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
defaultUserMessage);
+        log.warn("Exception occurred", exception);
 
         final ApiParameterError error = 
ApiParameterError.generalError(globalisationMessageCode, defaultUserMessage);
 
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/AccessDeniedExceptionMapper.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/AccessDeniedExceptionMapper.java
index c870df5c7..4c944c223 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/AccessDeniedExceptionMapper.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/AccessDeniedExceptionMapper.java
@@ -46,7 +46,7 @@ public class AccessDeniedExceptionMapper implements 
ExceptionMapper<AccessDenied
         // Status code 403 really reads as:
         // "Authenticated - but not authorized":
         final String defaultUserMessage = exception.getMessage();
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
defaultUserMessage);
+        log.warn("Exception occurred", exception);
         return 
Response.status(Status.FORBIDDEN).entity(ApiGlobalErrorResponse.unAuthorized(defaultUserMessage))
                 .type(MediaType.APPLICATION_JSON).build();
     }
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/BadCredentialsExceptionMapper.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/BadCredentialsExceptionMapper.java
index 833361157..c00e84645 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/BadCredentialsExceptionMapper.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/BadCredentialsExceptionMapper.java
@@ -44,7 +44,7 @@ public class BadCredentialsExceptionMapper implements 
ExceptionMapper<BadCredent
 
     @Override
     public Response toResponse(@SuppressWarnings("unused") final 
BadCredentialsException exception) {
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
exception.getMessage());
+        log.warn("Exception occurred", exception);
         return 
Response.status(Status.UNAUTHORIZED).entity(ApiGlobalErrorResponse.unAuthenticated()).type(MediaType.APPLICATION_JSON)
                 .build();
     }
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/BusinessStepExceptionMapper.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/BusinessStepExceptionMapper.java
index e91b90a76..29432325e 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/BusinessStepExceptionMapper.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/BusinessStepExceptionMapper.java
@@ -36,7 +36,7 @@ public class BusinessStepExceptionMapper implements 
ExceptionMapper<BusinessStep
     public Response toResponse(BusinessStepException exception) {
         final String globalisationMessageCode = 
"error.msg.invalid.request.body";
         final String defaultUserMessage = exception.getMessage();
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
defaultUserMessage);
+        log.warn("Exception occurred", exception);
 
         final ApiParameterError error = 
ApiParameterError.parameterError(globalisationMessageCode, defaultUserMessage, 
"stepName");
 
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/BusinessStepNotBelongsToJobExceptionMapper.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/BusinessStepNotBelongsToJobExceptionMapper.java
index 1ef6cc52a..731fc5d42 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/BusinessStepNotBelongsToJobExceptionMapper.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/BusinessStepNotBelongsToJobExceptionMapper.java
@@ -36,7 +36,7 @@ public class BusinessStepNotBelongsToJobExceptionMapper 
implements ExceptionMapp
     public Response toResponse(BusinessStepNotBelongsToJobException exception) 
{
         final String globalisationMessageCode = 
"error.msg.invalid.request.body";
         final String defaultUserMessage = "One of the provided Business Steps 
does not belong to the provided Job Name.";
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
defaultUserMessage);
+        log.warn("Exception occurred", exception);
 
         final ApiParameterError error = 
ApiParameterError.generalError(globalisationMessageCode, defaultUserMessage);
 
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/ConcurrencyFailureExceptionMapper.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/ConcurrencyFailureExceptionMapper.java
index d3d8f9710..0d63157cd 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/ConcurrencyFailureExceptionMapper.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/ConcurrencyFailureExceptionMapper.java
@@ -43,7 +43,7 @@ public class ConcurrencyFailureExceptionMapper implements 
FineractExceptionMappe
 
     @Override
     public Response toResponse(final ConcurrencyFailureException exception) {
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
exception.getMessage());
+        log.warn("Exception occurred", exception);
         String type;
         String identifier;
         if (exception instanceof ObjectOptimisticLockingFailureException olex) 
{
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/DefaultExceptionMapper.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/DefaultExceptionMapper.java
index 76008cfe8..e6a283ce2 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/DefaultExceptionMapper.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/DefaultExceptionMapper.java
@@ -40,9 +40,10 @@ public class DefaultExceptionMapper implements 
FineractExceptionMapper, Exceptio
     }
 
     @Override
-    public Response toResponse(RuntimeException runtimeException) {
+    public Response toResponse(RuntimeException exception) {
+        log.warn("Exception occurred", exception);
         return Response.status(SC_INTERNAL_SERVER_ERROR)
-                .entity(Map.of("Exception", 
ObjectUtils.defaultIfNull(runtimeException.getMessage(), "No error message 
available")))
+                .entity(Map.of("Exception", 
ObjectUtils.defaultIfNull(exception.getMessage(), "No error message 
available")))
                 .type(MediaType.APPLICATION_JSON).build();
     }
 }
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/IdempotentCommandExceptionMapper.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/IdempotentCommandExceptionMapper.java
index c37625041..df17e3d13 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/IdempotentCommandExceptionMapper.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/IdempotentCommandExceptionMapper.java
@@ -46,7 +46,7 @@ public class IdempotentCommandExceptionMapper implements 
FineractExceptionMapper
 
     @Override
     public Response toResponse(final AbstractIdempotentCommandException 
exception) {
-        log.warn("Processing {} request: {}", exception.getClass().getName(), 
exception.getMessage());
+        log.warn("Exception occurred", exception);
         Integer status = null;
         if (exception instanceof IdempotentCommandProcessSucceedException pse) 
{
             Integer statusCode = pse.getStatusCode();
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/InvalidInstanceTypeMethodExceptionMapper.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/InvalidInstanceTypeMethodExceptionMapper.java
index 573967be5..dfae947a1 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/InvalidInstanceTypeMethodExceptionMapper.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/InvalidInstanceTypeMethodExceptionMapper.java
@@ -39,7 +39,7 @@ public class InvalidInstanceTypeMethodExceptionMapper 
implements ExceptionMapper
 
     @Override
     public Response toResponse(final InvalidInstanceTypeMethodException 
exception) {
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
exception.getMessage());
+        log.warn("Exception occurred", exception);
         ApiGlobalErrorResponse errorResponse = 
ApiGlobalErrorResponse.invalidInstanceTypeMethod(exception.getMethod());
         return 
Response.status(Status.METHOD_NOT_ALLOWED).entity(errorResponse).type(MediaType.APPLICATION_JSON).build();
     }
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/InvalidJsonExceptionMapper.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/InvalidJsonExceptionMapper.java
index 02c032c80..35f07848e 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/InvalidJsonExceptionMapper.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/InvalidJsonExceptionMapper.java
@@ -42,7 +42,7 @@ public class InvalidJsonExceptionMapper implements 
ExceptionMapper<InvalidJsonEx
     public Response toResponse(@SuppressWarnings("unused") final 
InvalidJsonException exception) {
         final String globalisationMessageCode = 
"error.msg.invalid.request.body";
         final String defaultUserMessage = "The JSON provided in the body of 
the request is invalid or missing.";
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
defaultUserMessage);
+        log.warn("Exception occurred", exception);
 
         final ApiParameterError error = 
ApiParameterError.generalError(globalisationMessageCode, defaultUserMessage);
 
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/InvalidTenantIdentifierExceptionMapper.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/InvalidTenantIdentifierExceptionMapper.java
index ec72aad1c..6751ed891 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/InvalidTenantIdentifierExceptionMapper.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/InvalidTenantIdentifierExceptionMapper.java
@@ -44,7 +44,7 @@ public class InvalidTenantIdentifierExceptionMapper 
implements ExceptionMapper<I
 
     @Override
     public Response toResponse(@SuppressWarnings("unused") final 
InvalidTenantIdentifierException exception) {
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
exception.getMessage());
+        log.warn("Exception occurred", exception);
         return 
Response.status(Status.UNAUTHORIZED).entity(ApiGlobalErrorResponse.invalidTenantIdentifier())
                 .type(MediaType.APPLICATION_JSON).build();
     }
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 53a570339..73b71b3e8 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
@@ -34,7 +34,7 @@ public class JobIsNotFoundOrNotEnabledExceptionMapper 
implements ExceptionMapper
 
     @Override
     public Response toResponse(JobIsNotFoundOrNotEnabledException exception) {
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
exception.getMessage());
+        log.warn("Exception occurred", 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/JsonPathExceptionMapper.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JsonPathExceptionMapper.java
index 8316a0818..3ce0affde 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
@@ -38,7 +38,7 @@ public class JsonPathExceptionMapper implements 
ExceptionMapper<JsonPathExceptio
     public Response toResponse(JsonPathException exception) {
         final String globalisationMessageCode = "error.msg.invalid.json.path";
         final String defaultUserMessage = "The referenced JSON path is 
invalid.";
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
defaultUserMessage);
+        log.warn("Exception occurred", exception);
 
         final ApiParameterError error = 
ApiParameterError.generalError(globalisationMessageCode, defaultUserMessage);
 
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JsonSyntaxExceptionMapper.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JsonSyntaxExceptionMapper.java
index 93a88a2fd..f32e5517b 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JsonSyntaxExceptionMapper.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JsonSyntaxExceptionMapper.java
@@ -42,7 +42,7 @@ public class JsonSyntaxExceptionMapper implements 
ExceptionMapper<JsonSyntaxExce
     public Response toResponse(final JsonSyntaxException exception) {
         final String globalisationMessageCode = 
"error.msg.invalid.request.body";
         final String defaultUserMessage = "The JSON syntax provided in the 
body of the request is invalid: " + exception.getMessage();
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
defaultUserMessage);
+        log.warn("Exception occurred", exception);
 
         final ApiParameterError error = 
ApiParameterError.generalError(globalisationMessageCode, defaultUserMessage);
 
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/MalformedJsonExceptionMapper.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/MalformedJsonExceptionMapper.java
index 9a7a6967c..fd650c5da 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/MalformedJsonExceptionMapper.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/MalformedJsonExceptionMapper.java
@@ -42,7 +42,7 @@ public class MalformedJsonExceptionMapper implements 
ExceptionMapper<MalformedJs
     public Response toResponse(@SuppressWarnings("unused") final 
MalformedJsonException exception) {
         final String globalisationMessageCode = 
"error.msg.invalid.request.body";
         final String defaultUserMessage = "The JSON provided in the body of 
the request is invalid or missing.";
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
defaultUserMessage);
+        log.warn("Exception occurred", exception);
 
         final ApiParameterError error = 
ApiParameterError.generalError(globalisationMessageCode, defaultUserMessage);
 
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/NoAuthorizationExceptionMapper.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/NoAuthorizationExceptionMapper.java
index 3fa320767..af35c839a 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/NoAuthorizationExceptionMapper.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/NoAuthorizationExceptionMapper.java
@@ -47,7 +47,7 @@ public class NoAuthorizationExceptionMapper implements 
ExceptionMapper<NoAuthori
         // Status code 403 really reads as:
         // "Authenticated - but not authorized":
         final String defaultUserMessage = exception.getMessage();
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
defaultUserMessage);
+        log.warn("Exception occurred", exception);
         return 
Response.status(Status.FORBIDDEN).entity(ApiGlobalErrorResponse.unAuthorized(defaultUserMessage))
                 .type(MediaType.APPLICATION_JSON).build();
     }
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/OAuth2ExceptionEntryPoint.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/OAuth2ExceptionEntryPoint.java
index 0902dc51c..cb247858d 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/OAuth2ExceptionEntryPoint.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/OAuth2ExceptionEntryPoint.java
@@ -22,7 +22,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import jakarta.servlet.ServletException;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
-import java.io.IOException;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.fineract.infrastructure.core.data.ApiGlobalErrorResponse;
 import org.springframework.security.core.AuthenticationException;
@@ -32,9 +31,9 @@ import 
org.springframework.security.web.AuthenticationEntryPoint;
 public class OAuth2ExceptionEntryPoint implements AuthenticationEntryPoint {
 
     @Override
-    public void commence(HttpServletRequest request, HttpServletResponse 
response, AuthenticationException authException)
-            throws IOException, ServletException {
-        log.warn("Exception: {}, Message: {}", 
authException.getClass().getName(), authException.getMessage());
+    public void commence(HttpServletRequest request, HttpServletResponse 
response, AuthenticationException exception)
+            throws ServletException {
+        log.warn("Exception occurred", exception);
         ApiGlobalErrorResponse errorResponse = 
ApiGlobalErrorResponse.unAuthenticated();
         response.setContentType("application/json");
         response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/OptimisticLockExceptionMapper.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/OptimisticLockExceptionMapper.java
index 3e293d19b..0417fe520 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/OptimisticLockExceptionMapper.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/OptimisticLockExceptionMapper.java
@@ -43,7 +43,7 @@ public class OptimisticLockExceptionMapper implements 
FineractExceptionMapper, E
 
     @Override
     public Response toResponse(final OptimisticLockException exception) {
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
exception.getMessage());
+        log.warn("Exception occurred", 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 728317329..0fb62b182 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
@@ -45,7 +45,7 @@ public class PlatformApiDataValidationExceptionMapper
 
     @Override
     public Response toResponse(final PlatformApiDataValidationException 
exception) {
-        log.warn("Exception: {}, Message: {}, Errors: {}", 
exception.getClass().getName(), exception.getMessage(), exception.getErrors());
+        log.warn("Exception occurred", 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 ba131591f..54e6a2b30 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
@@ -44,7 +44,7 @@ public class PlatformDataIntegrityExceptionMapper implements 
FineractExceptionMa
 
     @Override
     public Response toResponse(final PlatformDataIntegrityException exception) 
{
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
exception.getMessage());
+        log.warn("Exception occurred", 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 2b7ae0ae0..9b7fac95e 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
@@ -44,7 +44,7 @@ public class PlatformDomainRuleExceptionMapper implements 
FineractExceptionMappe
 
     @Override
     public Response toResponse(final AbstractPlatformDomainRuleException 
exception) {
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
exception.getMessage());
+        log.warn("Exception occurred", 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 84578a6f0..e0231f097 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
@@ -43,7 +43,7 @@ public class PlatformInternalServerExceptionMapper implements 
FineractExceptionM
 
     @Override
     public Response toResponse(final PlatformInternalServerException 
exception) {
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
exception.getMessage());
+        log.warn("Exception occurred", 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 6eb636ffe..c0a875c6a 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
@@ -38,7 +38,7 @@ public class 
PlatformRequestBodyItemLimitValidationExceptionMapper
     @Override
     public Response toResponse(PlatformRequestBodyItemLimitValidationException 
exception) {
         String globalisationMessage = 
"error.msg.validation.request.body.item.limit.validation";
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
exception.getMessage());
+        log.warn("Exception occurred", 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 e2f9f1b21..56ba36497 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
@@ -45,7 +45,7 @@ public class PlatformResourceNotFoundExceptionMapper
 
     @Override
     public Response toResponse(final AbstractPlatformResourceNotFoundException 
exception) {
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
exception.getMessage());
+        log.warn("Exception occurred", 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 d0309fc69..38f4074b2 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
@@ -45,7 +45,7 @@ public class PlatformServiceUnavailableExceptionMapper 
implements ExceptionMappe
 
     @Override
     public Response toResponse(final 
AbstractPlatformServiceUnavailableException exception) {
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
exception.getMessage());
+        log.warn("Exception occurred", 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 dfa2d3da8..33087afbe 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
@@ -45,7 +45,7 @@ public class RollbackTransactionNotApprovedExceptionMapper
 
     @Override
     public Response toResponse(final RollbackTransactionNotApprovedException 
exception) {
-        log.warn("Exception: {}", exception.getClass().getName());
+        log.warn("Exception occurred", 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 45d55d33c..0f979f01c 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
@@ -42,7 +42,7 @@ public class UnAuthenticatedUserExceptionMapper implements 
ExceptionMapper<UnAut
     @Override
     public Response toResponse(@SuppressWarnings("unused") final 
UnAuthenticatedUserException exception) {
         // Status code 401 really reads as: "Unauthenticated":
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
exception.getMessage());
+        log.warn("Exception occurred", exception);
         return 
Response.status(Status.UNAUTHORIZED).entity(ApiGlobalErrorResponse.unAuthenticated()).type(MediaType.APPLICATION_JSON)
                 .build();
     }
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/UnrecognizedQueryParamExceptionMapper.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/UnrecognizedQueryParamExceptionMapper.java
index 8ed7d72c6..e952a74eb 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/UnrecognizedQueryParamExceptionMapper.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/UnrecognizedQueryParamExceptionMapper.java
@@ -55,7 +55,7 @@ public class UnrecognizedQueryParamExceptionMapper implements 
ExceptionMapper<Un
                 .append(parameterName) //
                 .append(" has an unsupported value of: ") //
                 .append(parameterValue);
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
defaultEnglishMessage);
+        log.warn("Exception occurred", exception);
 
         final ApiParameterError error = 
ApiParameterError.parameterError(validationErrorCode.toString(), 
defaultEnglishMessage.toString(),
                 parameterName, parameterName, parameterValue, 
exception.getSupportedParams());
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/UnsupportedCommandExceptionMapper.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/UnsupportedCommandExceptionMapper.java
index 39021b96c..daaf720ec 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/UnsupportedCommandExceptionMapper.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/UnsupportedCommandExceptionMapper.java
@@ -53,7 +53,7 @@ public class UnsupportedCommandExceptionMapper implements 
ExceptionMapper<Unsupp
         if (message != null) {
             defaultEnglishMessage.append(" ").append(message);
         }
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
defaultEnglishMessage);
+        log.warn("Exception occurred", exception);
         final ApiParameterError error = 
ApiParameterError.parameterError(validationErrorCode.toString(), 
defaultEnglishMessage.toString(),
                 exception.getUnsupportedCommandName(), 
exception.getUnsupportedCommandName());
 
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/UnsupportedParameterExceptionMapper.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/UnsupportedParameterExceptionMapper.java
index 8abda8b0d..65d515ff9 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/UnsupportedParameterExceptionMapper.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/UnsupportedParameterExceptionMapper.java
@@ -55,7 +55,7 @@ public class UnsupportedParameterExceptionMapper implements 
FineractExceptionMap
 
             errors.add(error);
         }
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
errors);
+        log.warn("Exception occurred", exception);
 
         final ApiGlobalErrorResponse invalidParameterError = 
ApiGlobalErrorResponse
                 .badClientRequest("validation.msg.validation.errors.exist", 
"Validation errors exist.", errors);
diff --git 
a/fineract-investor/src/main/java/org/apache/fineract/investor/exception/exceptionmapper/ExternalAssetOwnerInitiateTransferExceptionMapper.java
 
b/fineract-investor/src/main/java/org/apache/fineract/investor/exception/exceptionmapper/ExternalAssetOwnerInitiateTransferExceptionMapper.java
index 8499dc038..e10fabab2 100644
--- 
a/fineract-investor/src/main/java/org/apache/fineract/investor/exception/exceptionmapper/ExternalAssetOwnerInitiateTransferExceptionMapper.java
+++ 
b/fineract-investor/src/main/java/org/apache/fineract/investor/exception/exceptionmapper/ExternalAssetOwnerInitiateTransferExceptionMapper.java
@@ -36,7 +36,7 @@ public class 
ExternalAssetOwnerInitiateTransferExceptionMapper implements Except
     public Response toResponse(ExternalAssetOwnerInitiateTransferException 
exception) {
         final String globalisationMessageCode = 
"error.msg.external.asset.owner.initiate";
         final String defaultUserMessage = exception.getMessage();
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
defaultUserMessage);
+        log.warn("Exception occurred", exception);
 
         final ApiParameterError error = 
ApiParameterError.generalError(globalisationMessageCode, defaultUserMessage);
 
diff --git 
a/fineract-loan/src/main/java/org/apache/fineract/infrastructure/core/exception/LinkedAccountRequiredExceptionMapper.java
 
b/fineract-loan/src/main/java/org/apache/fineract/infrastructure/core/exception/LinkedAccountRequiredExceptionMapper.java
index 9e69d82ea..8f24811cf 100644
--- 
a/fineract-loan/src/main/java/org/apache/fineract/infrastructure/core/exception/LinkedAccountRequiredExceptionMapper.java
+++ 
b/fineract-loan/src/main/java/org/apache/fineract/infrastructure/core/exception/LinkedAccountRequiredExceptionMapper.java
@@ -35,7 +35,7 @@ public class LinkedAccountRequiredExceptionMapper implements 
FineractExceptionMa
 
     @Override
     public Response toResponse(LinkedAccountRequiredException exception) {
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
exception.getMessage());
+        log.warn("Exception occurred", 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-loan/src/main/java/org/apache/fineract/infrastructure/core/exception/LoanIdsHardLockedExceptionMapper.java
 
b/fineract-loan/src/main/java/org/apache/fineract/infrastructure/core/exception/LoanIdsHardLockedExceptionMapper.java
index 7f47c4056..81f074358 100644
--- 
a/fineract-loan/src/main/java/org/apache/fineract/infrastructure/core/exception/LoanIdsHardLockedExceptionMapper.java
+++ 
b/fineract-loan/src/main/java/org/apache/fineract/infrastructure/core/exception/LoanIdsHardLockedExceptionMapper.java
@@ -36,6 +36,7 @@ public class LoanIdsHardLockedExceptionMapper implements 
FineractExceptionMapper
 
     @Override
     public Response toResponse(LoanIdsHardLockedException exception) {
+        log.warn("Exception occurred", exception);
         return Response.status(HttpStatus.SC_CONFLICT)
                 
.entity(ApiGlobalErrorResponse.loanIsLocked(exception.getLoanIdFromRequest()).toJson()).type(MediaType.APPLICATION_JSON)
                 .build();
diff --git 
a/fineract-loan/src/main/java/org/apache/fineract/infrastructure/core/exception/MultiDisbursementDataRequiredExceptionMapper.java
 
b/fineract-loan/src/main/java/org/apache/fineract/infrastructure/core/exception/MultiDisbursementDataRequiredExceptionMapper.java
index 931cee3a8..c8b675306 100644
--- 
a/fineract-loan/src/main/java/org/apache/fineract/infrastructure/core/exception/MultiDisbursementDataRequiredExceptionMapper.java
+++ 
b/fineract-loan/src/main/java/org/apache/fineract/infrastructure/core/exception/MultiDisbursementDataRequiredExceptionMapper.java
@@ -36,7 +36,7 @@ public class MultiDisbursementDataRequiredExceptionMapper
 
     @Override
     public Response toResponse(MultiDisbursementDataRequiredException 
exception) {
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
exception.getMessage());
+        log.warn("Exception occurred", 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-loan/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/LoanAccountLockCannotBeOverruledExceptionMapper.java
 
b/fineract-loan/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/LoanAccountLockCannotBeOverruledExceptionMapper.java
index 9ae767e22..3cdfd2e37 100644
--- 
a/fineract-loan/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/LoanAccountLockCannotBeOverruledExceptionMapper.java
+++ 
b/fineract-loan/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/LoanAccountLockCannotBeOverruledExceptionMapper.java
@@ -36,7 +36,7 @@ public class LoanAccountLockCannotBeOverruledExceptionMapper 
implements Exceptio
     public Response toResponse(LoanAccountLockCannotBeOverruledException 
exception) {
         final String globalisationMessageCode = 
"error.msg.invalid.request.body";
         final String defaultUserMessage = exception.getMessage();
-        log.warn("Exception: {}, Message: {}", exception.getClass().getName(), 
defaultUserMessage);
+        log.warn("Exception occurred", exception);
 
         final ApiParameterError error = 
ApiParameterError.generalError(globalisationMessageCode, defaultUserMessage);
 


Reply via email to