从 LWC 调用具有多个签名的 Apex 方法

Calling Apex method with multiple signatures from LWC

我注意到我正在构建的 LWC 中有一些有趣的行为,但未能找到有关原因的太多信息。基本上我有一个用多个签名声明的 Apex 方法:

// 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
     ....
}

当我尝试从 LWC 调用 myMethod 并且只将两个参数传递给该方法时,我希望调用 2 参数签名方法,但是实际情况是 3 参数签名方法被调用,null 的值作为第三个参数值传递。

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

这是预期的行为吗?当我通过 apex 调用方法时,正确的方法由其签名调用,但是从 LWC 调用方法时似乎并非如此。

有没有办法让我从 LWC 调用正确签名的 myMethod Apex 方法?

编辑:

它将在 Summer'22 版本的编译时被禁止。 https://help.salesforce.com/s/articleView?id=release-notes.rn_apex_ValidationForAuraEnabledAnnotation.htm&type=5&release=238

原文:

比你想象的还要糟糕。 runJob({param2, param1}) 也能正常工作。 “正确”的意思是他们的名字很重要,而不是职位!

您的内容始终作为对象而不是参数列表传递。你可以有一个助手 Apex 包装器 class 并且(假设所有字段都是 @AuraEnabled)它会正确映射它们。如果您有参数列表 - 那么,甚至在调用您的代码之前就会发生一种拆箱和类型匹配。如果您将“abc”传递给 Date 变量 - JSON 反序列化错误甚至在您的代码运行之前就会抛出,您无法捕获它。

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.

所以...取不同的名字?或汇集它们,以便 3 参数版本查看最后一个参数并在需要时调用 2 参数版本并且业务逻辑允许。一般来说 - 保持简单,留下一些评论和好的单元测试,或者 2 个月后,可怜的维护人员会很挣扎。

并且(如果您使用 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

另见