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 b4fa48263b FINERACT-2421: Fix potential NullPointerException in 
CalendarCommandFromApiJsonDeserializer
b4fa48263b is described below

commit b4fa48263bf0d438a273f97e6ba846f81554a3d9
Author: airajena <[email protected]>
AuthorDate: Sat Dec 27 19:41:11 2025 +0530

    FINERACT-2421: Fix potential NullPointerException in 
CalendarCommandFromApiJsonDeserializer
    
    The extractBooleanNamed method can return null when the JSON value is null
    or missing. Using primitive boolean causes automatic unboxing which throws
    NullPointerException.
    
    Changes:
    - CalendarCommandFromApiJsonDeserializer: Use Boolean wrapper instead of
      primitive boolean for 'repeating' field extraction
    - CalendarCommandFromApiJsonDeserializer: Use Boolean.TRUE.equals() for
      null-safe boolean comparison
    - CalendarCommand: Update field type and constructor parameter from
      boolean to Boolean to support null values
    
    This addresses the FIXME comments on lines 156 and 298 in the original file.
---
 .../fineract/portfolio/calendar/command/CalendarCommand.java |  4 ++--
 .../CalendarCommandFromApiJsonDeserializer.java              | 12 +++++-------
 2 files changed, 7 insertions(+), 9 deletions(-)

diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/command/CalendarCommand.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/command/CalendarCommand.java
index 005ed9b7d7..dea2009a48 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/command/CalendarCommand.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/command/CalendarCommand.java
@@ -39,7 +39,7 @@ public class CalendarCommand {
     @SuppressWarnings("unused")
     private final Integer typeId;
     @SuppressWarnings("unused")
-    private final boolean repeating;
+    private final Boolean repeating;
     @SuppressWarnings("unused")
     private final Integer remindById;
     @SuppressWarnings("unused")
@@ -48,7 +48,7 @@ public class CalendarCommand {
     private final Integer secondReminder;
 
     public CalendarCommand(final String title, final String description, final 
String location, final LocalDate startDate,
-            final LocalDate endDate, final LocalDate createdDate, final 
Integer duration, final Integer typeId, final boolean repeating,
+            final LocalDate endDate, final LocalDate createdDate, final 
Integer duration, final Integer typeId, final Boolean repeating,
             final Integer remindById, final Integer firstReminder, final 
Integer secondReminder) {
         this.title = title;
         this.description = description;
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/serialization/CalendarCommandFromApiJsonDeserializer.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/serialization/CalendarCommandFromApiJsonDeserializer.java
index 0a39f1dd25..8f6c2395b5 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/serialization/CalendarCommandFromApiJsonDeserializer.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/serialization/CalendarCommandFromApiJsonDeserializer.java
@@ -81,7 +81,7 @@ public class CalendarCommandFromApiJsonDeserializer extends 
AbstractFromApiJsonD
                 element);
         final Integer typeId = 
this.fromApiJsonHelper.extractIntegerSansLocaleNamed(CalendarSupportedParameters.TYPE_ID.getValue(),
                 element);
-        final boolean repeating = 
this.fromApiJsonHelper.extractBooleanNamed(CalendarSupportedParameters.REPEATING.getValue(),
 element);
+        final Boolean repeating = 
this.fromApiJsonHelper.extractBooleanNamed(CalendarSupportedParameters.REPEATING.getValue(),
 element);
         final Integer remindById = 
this.fromApiJsonHelper.extractIntegerSansLocaleNamed(CalendarSupportedParameters.REMIND_BY_ID.getValue(),
                 element);
         final Integer firstReminder = this.fromApiJsonHelper
@@ -153,11 +153,10 @@ public class CalendarCommandFromApiJsonDeserializer 
extends AbstractFromApiJsonD
                 .inMinMaxRange(CalendarEntityType.getMinValue(), 
CalendarEntityType.getMaxValue());
 
         if 
(this.fromApiJsonHelper.parameterExists(CalendarSupportedParameters.REPEATING.getValue(),
 element)) {
-            // FIXME - Throws NullPointerException when boolean value is null
-            final boolean repeating = 
this.fromApiJsonHelper.extractBooleanNamed(CalendarSupportedParameters.REPEATING.getValue(),
 element);
+            final Boolean repeating = 
this.fromApiJsonHelper.extractBooleanNamed(CalendarSupportedParameters.REPEATING.getValue(),
 element);
             
baseDataValidator.reset().parameter(CalendarSupportedParameters.REPEATING.getValue()).value(repeating).notNull();
 
-            if (repeating) {
+            if (Boolean.TRUE.equals(repeating)) {
                 final Integer frequency = this.fromApiJsonHelper
                         
.extractIntegerSansLocaleNamed(CalendarSupportedParameters.FREQUENCY.getValue(),
 element);
                 
baseDataValidator.reset().parameter(CalendarSupportedParameters.FREQUENCY.getValue()).value(frequency).notBlank()
@@ -295,11 +294,10 @@ public class CalendarCommandFromApiJsonDeserializer 
extends AbstractFromApiJsonD
                     .inMinMaxRange(CalendarEntityType.getMinValue(), 
CalendarEntityType.getMaxValue());
         }
         if 
(this.fromApiJsonHelper.parameterExists(CalendarSupportedParameters.REPEATING.getValue(),
 element)) {
-            // FIXME - Throws NullPointerException when boolean value is null
-            final boolean repeating = 
this.fromApiJsonHelper.extractBooleanNamed(CalendarSupportedParameters.REPEATING.getValue(),
 element);
+            final Boolean repeating = 
this.fromApiJsonHelper.extractBooleanNamed(CalendarSupportedParameters.REPEATING.getValue(),
 element);
             
baseDataValidator.reset().parameter(CalendarSupportedParameters.REPEATING.getValue()).value(repeating).notNull();
 
-            if (repeating) {
+            if (Boolean.TRUE.equals(repeating)) {
                 final Integer frequency = this.fromApiJsonHelper
                         
.extractIntegerSansLocaleNamed(CalendarSupportedParameters.FREQUENCY.getValue(),
 element);
                 
baseDataValidator.reset().parameter(CalendarSupportedParameters.FREQUENCY.getValue()).value(frequency).notBlank()

Reply via email to