'Calling Apex method with multiple signatures from LWC

I've noticed some interesting behavior in an LWC that I am building and haven't been able to find much info on the cause. Basically I have an Apex method declared with multiple signatures:

// myMethod with 2 param signature
@AuraEnabled
public static void myMethod(String param1, String param2) {
     // I expect this method to be invoked when called from the LWC code shown below
     ....
}

// myMethod with 3 param signature
@AuraEnabled
public static void myMethod(String param1, String param2, Boolean param3) {
     // However this method gets invoked instead
     ....
}

When I attempt to call myMethod from an LWC, and only pass two parameters into the method, I would expect that the 2 param signature method would be invoked, however what happens is that the 3 param signature method is invoked, and the value of null is passed as the third params value.

runJob({param1, param2}).then(value => ... )

Is this expected behavior? When I call the methods through apex, the correct method is invoked by its signature, however this doesn't seem to be the case when calling the method from an LWC.

Is there a way for me to invoke the myMethod Apex method of the correct signature from an LWC?



Solution 1:[1]

Edit:

it will be banned at compile time in Summer'22 release. https://help.salesforce.com/s/articleView?id=release-notes.rn_apex_ValidationForAuraEnabledAnnotation.htm&type=5&release=238

Original:

It's worse than you think. runJob({param2, param1}) will work correctly too. "Correctly" meaning their names matter, not the position!

Your stuff is always passed as an object, not a list of parameters. You could have a helper Apex wrapper class and (assuming all fields are @AuraEnabled) it'll map them correctly. If you have list of parameters - well, a kind of unboxing and type matching happens even before your code is called. If you passed "abc" to a Date variable - a JSON deserialization error is thrown even before your code runs, you have no means to catch it.

https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.apex_wire_method

If the Apex method is overloaded, the choice of what method to call is non-deterministic (effectively random), and the parameters passed may cause errors now or in the future. Don't overload @AuraEnabled Apex methods.

So... pick different names? Or funnel them so the 3-param version looks at the last param and calls 2-param one if needed and the business logic allows it. Generally - keep it simple, leave some comments and good unit tests or 2 months from now poor maintenance guy will struggle.

And (if you use the Apex PMD plugin and/or sfdx scanner) functions with long parameter lists are frowned upon anyway: https://pmd.github.io/latest/pmd_rules_apex_design.html#excessiveparameterlist

See also

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1