【问题标题】:Not sure of input parameters for Groovy call: Ambiguous method overloading不确定 Groovy 调用的输入参数:不明确的方法重载
【发布时间】:2016-03-07 14:45:16
【问题描述】:

我还是 groovy/grails 的新手,但是当我尝试调用 Grails 3.0.9 的邮件插件时,我无法弄清楚以下语法有什么问题:

class Email {
    String subject;
    List<String> toEmail;
    List<String> ccEmail;
    List<String> bccEmail;
    String body;
}


    Email email = new Email(toEmail: ["test@mail.com"], body: "Hi", subject: "Yo")
    mailService.sendMail {
        to email.toEmail.toArray()
        from "no-reply@fake.com"
        cc email.ccEmail?.toArray()
        bcc email.bccEmail?.toArray()
        subject email.subject
        body email.body
    }

当我没有人要抄送时,在 cc 参数行会引发以下异常。但是,我原以为 elvis 运算符会返回 null 并且一切都会好起来的。我错过了什么?我觉得如果没有数据存在,我可能根本不应该设置 cc 和 bcc 字段,但我不确定为什么这会导致问题(可能是插件内部的问题)以及如何围绕这个进行编码边缘情况(单独构建参数并将它们作为变量传递?)

groovy.lang.GroovyRuntimeException: Ambiguous method overloading for method org.springframework.util.Assert#notEmpty.
Cannot resolve which method to invoke for [null, class java.lang.String] due to overlapping prototypes between:
    [interface java.util.Collection, class java.lang.String]
    [interface java.util.Map, class java.lang.String]
    at groovy.lang.MetaClassImpl.chooseMostSpecificParams(MetaClassImpl.java:3241) ~[groovy-2.4.5.jar:2.4.5]
    at groovy.lang.MetaClassImpl.chooseMethodInternal(MetaClassImpl.java:3194) ~[groovy-2.4.5.jar:2.4.5]
    at groovy.lang.MetaClassImpl.chooseMethod(MetaClassImpl.java:3137) ~[groovy-2.4.5.jar:2.4.5]
    at groovy.lang.MetaClassImpl.pickStaticMethod(MetaClassImpl.java:1508) ~[groovy-2.4.5.jar:2.4.5]
    at groovy.lang.MetaClassImpl.retrieveStaticMethod(MetaClassImpl.java:1404) ~[groovy-2.4.5.jar:2.4.5]
    at groovy.lang.MetaClassImpl.createStaticSite(MetaClassImpl.java:3383) ~[groovy-2.4.5.jar:2.4.5]
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallStaticSite(CallSiteArray.java:77) [groovy-2.4.5.jar:2.4.5]
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:162) [groovy-2.4.5.jar:2.4.5]
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) [groovy-2.4.5.jar:2.4.5]
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) [groovy-2.4.5.jar:2.4.5]
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133) [groovy-2.4.5.jar:2.4.5]
    at grails.plugins.mail.MailMessageBuilder.cc(MailMessageBuilder.groovy:214) ~[mail-2.0.0.RC4.jar:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_51]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_51]
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) ~[groovy-2.4.5.jar:2.4.5]
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) ~[groovy-2.4.5.jar:2.4.5]
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:384) ~[groovy-2.4.5.jar:2.4.5]
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019) ~[groovy-2.4.5.jar:2.4.5]
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:69) ~[groovy-2.4.5.jar:2.4.5]
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52) [groovy-2.4.5.jar:2.4.5]
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154) [groovy-2.4.5.jar:2.4.5]
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166) [groovy-2.4.5.jar:2.4.5]
    at com.doctorsorders.email.EmailService$_sendEmail_closure1.doCall(EmailService.groovy:19) ~[main/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_51]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_51]
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) ~[groovy-2.4.5.jar:2.4.5]
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) ~[groovy-2.4.5.jar:2.4.5]
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294) ~[groovy-2.4.5.jar:2.4.5]
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019) ~[groovy-2.4.5.jar:2.4.5]
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:42) ~[groovy-2.4.5.jar:2.4.5]
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) [groovy-2.4.5.jar:2.4.5]
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) [groovy-2.4.5.jar:2.4.5]
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) [groovy-2.4.5.jar:2.4.5]

【问题讨论】:

  • bccEmail的类型是什么?
  • 代替 cc email.ccEmail?.toArray() & bcc email.bccEmail?.toArray(),尝试:cc email.ccEmail?.toArray():[] & bcc email.bccEmail? .toArray()?:[]
  • @Opal:这是一个字符串列表,我添加了电子邮件类。
  • @SandeepPoonia 我喜欢你的想法,但你提供的代码无法编译
  • 试试 email.ccEmail ?: cc(email.ccEmail.toArray())。如果某些内容无法编译,您可以随时添加一对额外的大括号。

标签: grails groovy grails-3.0


【解决方案1】:

初始化您的列表

class Email {
    String subject
    List<String> toEmail = []
    List<String> ccEmail = []
    List<String> bccEmail = []
    String body
}

【讨论】:

  • 还是不行:“cc 不能为空或为空” 我认为这是插件的错,而不是语法
【解决方案2】:

我无法从社区中得到正确的答案,但是,公平地说,我认为很多 finnicky 行为归因于邮件插件的编写方式......或者可能是这种方式我正在使用它。

当时我没有意识到,但我正在向这个插件传递一个闭包,其中包含用于初始化电子邮件参数的一系列语句。

在闭包中有这样的语句:

bcc email.bccEmail?.toArray()

在没有指定电子邮件时破坏插件,因为创建了“bcc”变量并且该插件的实现现在需要一个值。我通过以下方式实现我的闭包来解决这个问题:

Closure mailServiceArgs = {
    to email.toEmail.toArray()
    from fromEmail
    subject email.subject
    body email.body
    if(email.ccEmail) cc email.ccEmail.toArray()
    if(email.bccEmail) bcc email.bccEmail.toArray()
}

然而,这带来了几个问题,因为我正在使用一个 if 语句编写我的闭包,该语句基于在我的应用程序范围内定义的变量 (email.ccEmail) 的状态。我假设这个值是通过引用传递的,所以在调用闭包时,值保持不变,但老实说,我不确定它是如何工作的,我也会研究它。

可能有一种“更漂亮”或更优雅的方式来执行此操作,而不是使用“if”语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多