2015-12-03 185 views
0

我仍然对groovy/grails不熟悉,但是当我尝试调用Grails 3.0.9的邮件插件时,我无法确定以下语法有什么问题:Groovy调用的输入参数不确定:模糊方法重载

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


    Email email = new Email(toEmail: ["[email protected]"], body: "Hi", subject: "Yo") 
    mailService.sendMail { 
     to email.toEmail.toArray() 
     from "[email protected]" 
     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] 
+0

什么是'bccEmail'类型? – Opal

+1

而不是cc email.ccEmail?.toArray()&bcc email.bccEmail?.toArray(),请尝试:cc email.ccEmail?.toArray():[]&bcc email.bccEmail?.toArray()?: ] –

+0

@Opal:这是一个字符串列表,我添加了电子邮件类。 – IcedDante

回答

0

我无法从社区得到正确的答案,但是,为了公平起见,我认为很多有趣的行为可以归因于邮件插件的写法......也许这是我使用它的方式。

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

有了这样的闭包内声明:

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'语句。

1

初始化您的清单

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

这仍然不起作用:“cc不能为空或空” 我认为这是插件的错误,而不是语法 – IcedDante

相关问题