2

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?

1 Answer 1

2

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

Sign up to request clarification or add additional context in comments.

1 Comment

This is super helpful and good to know! I will keep in mind not to overload @AuraEnabled methods anymore. Thank you for your detailed response!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.