Abhishek Chaudhary created FINERACT-2694:
--------------------------------------------

             Summary: POST /smscampaigns, /emailcampaigns and 
/standinginstructions return 500 NullPointerException instead of validation 
error when triggerType/campaignType/transferType is omitted
                 Key: FINERACT-2694
                 URL: https://issues.apache.org/jira/browse/FINERACT-2694
             Project: Apache Fineract
          Issue Type: Bug
          Components: Savings
    Affects Versions: 1.15.0
            Reporter: Abhishek Chaudhary


*Affected endpoints:*

* {{POST /smscampaigns}} and {{PUT /smscampaigns/\{id\}}} — omitting 
{{triggerType}}
* {{POST /emailcampaigns}} and {{PUT /emailcampaigns/\{id\}}} — omitting 
{{campaignType}}
* {{POST /standinginstructions}} — omitting {{transferType}}

*Steps to reproduce* (any of the three):

# {{POST /fineract-provider/api/v1/smscampaigns}} with a body that omits 
{{triggerType}}:
{code:json}
{"campaignName": "test"}
{code}
# {{POST /fineract-provider/api/v1/emailcampaigns}} with a body that omits 
{{campaignType}}
# {{POST /fineract-provider/api/v1/standinginstructions}} with a body that 
omits {{transferType}}

*Observed behaviour:*

{color:red}HTTP 500 Internal Server Error{color}

{noformat}
java.lang.NullPointerException: Cannot invoke "java.lang.Long.intValue()" 
because "triggerType" is null
{noformat}

(for standing instructions the NPE comes from the {{switch}} on a null 
{{Integer}} in {{AccountTransferType.fromInt(null)}})

*Expected behaviour:*

bq. HTTP 400 with a {{PlatformApiDataValidationException}} payload reporting 
that the parameter is mandatory, e.g. 
{{validation.msg.sms.triggerType.cannot.be.blank}}

*Root cause:*

The validators queue a {{notNull()}} validation error via 
{{DataValidatorBuilder}} but _dereference the extracted value before_ 
{{throwExceptionIfValidationWarningsExist()}} runs, so the queued error is 
never returned:

* {{SmsCampaignValidator.validateCreate}} / {{validateForUpdate}} — 
{{triggerType.intValue()}}
* {{EmailCampaignValidator.validateCreate}} / {{validateForUpdate}} — 
{{campaignType.intValue()}}
* {{StandingInstructionDataValidator.validateForCreate}} — 
{{AccountTransferType.fromInt(transferType)}}

In {{StandingInstructionDataValidator}} every _neighbouring_ parameter in the 
same method ({{recurrenceType}}, {{recurrenceFrequency}}, {{toAccountType}}, 
{{standingInstructionType}}, {{fromAccountType}}) *is* null-guarded — this one 
was missed.

Same defect class as FINERACT-2689 (fixed in PR 
[#6126|https://github.com/apache/fineract/pull/6126]) and FINERACT-2665 (PR 
[#6059|https://github.com/apache/fineract/pull/6059]).

*Proposed fix:*

Null-guard the seven dereference sites so the already-queued validation errors 
surface. No behaviour change for valid requests. Regression tests included 
({{SmsCampaignValidatorTest}}, {{EmailCampaignValidatorTest}}, 
{{StandingInstructionDataValidatorTest}} — the NPE tests fail without the fix).
{code} blocks and {noformat} render as code/preformatted panels in ASF Jira; 
the `\{id\}` escapes stop Jira from interpreting `{id}` as a macro; `#` lines 
render as a numbered list, `*` lines as bullets.

One caution: don't put the markup in the *summary* field — Jira titles render 
markup literally.




--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to