2015-12-03 191 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

相關問題