2014-04-18 90 views
0

我試圖攔截並可能修改所有對mailService.sendMail的呼叫,以便將電子郵件添加/修改爲bcc。這是一個臨時實驗,所以如果可能的話,我想避免查找/更改所有現有的代碼。通過metaClass在Grails電子郵件插件中添加/修改密件抄送

例子:

mailService.sendMail { 
    to '[email protected]' 
    //bcc may be present 
    from '[email protected]' 
    subject 'Hello' 
    body 'Just testing' 
} 

我能夠用這個引導程序中創建很輕鬆地攔截來電:

mailService.metaClass.invokeMethod = {String name, args -> 
    println "intercepting for ${name}..." 
    def res = delegate.metaClass.getMetaMethod(name, args).invoke(delegate, args) 
    println "done intercepting" 
} 

我是在一個完整的損失如何實際修改通話要麼添加一個密件,如果沒有,或者添加一個地址給它,如果它確實存在。 args參數是關閉 - 我已經看過我能找到的關於該主題的所有內容,而且沒有喜悅。

這是運行在Grails 1.3.7上(我知道)。您可以隨時添加,不論bcc一個bcc

回答

2

一種方式被前面所定義的,是一個新組成的原始封閉ARG:

mailService.metaClass.invokeMethod = {String name, args -> 

    if(name == 'sendMail') { 

     def newArgs = args[0] >> { bcc '[email protected]' } 

     //or def newArgs = { bcc '[email protected]' } << args[0] 

     def res = delegate.metaClass.getMetaMethod(name, newArgs) 
            .invoke(delegate, newArgs) 
    } 
} 

假設郵件應密件和bcc列表保持相同,這樣我們就不必跟蹤提供的bcc列表。確保方法的名稱始終檢查爲sendMail以避免截取其他方法,儘管所有方法都將在mailService bean中攔截,但他們將跳過其他方法,但是sendMail

UPDATE:
組成閉幕可以在Groovy 1.8和我高度懷疑的Groovy 1.8可以使用Grails 1.3.7。在這種情況下,您可以嘗試使用下面的方法:

mailService.metaClass.invokeMethod = {String name, args -> 
    if(name == 'sendMail') { 
     println "intercepting for ${name}..." 

     def newClos = { cl -> 
      return { 
       cl.delegate = delegate 
       cl.resolveStrategy = Closure.DELEGATE_FIRST 
       cl() 

       //bcc 
       bcc '[email protected]' 
      } 
     } 

     def newArgs = newClos args[0] 
     def res = delegate.metaClass.getMetaMethod(name, newArgs) 
            .invoke(delegate, newArgs) 
     println "done intercepting" 
    } 
} 
+0

問題是'args [0]'是發送到'sendMail'方法的閉包。我確實嘗試了兩個想法 - 右移賦予錯誤'方法rightShift()的簽名不適用於參數類型:closure25 ...'。左移引發了一系列攔截,導致堆棧溢出錯誤。順便說一下,我沒有想到出來,直到你提到它,但它實際上能夠解析關閉並跟蹤誰是人們試圖密件抄送... – Kelly

+0

你是否實施了IF語句爲我上面提到過?該IF塊應該避免stackoverflow錯誤。請再次通過答案。 – dmahapatro

+0

@Kelly封閉組合可能不起作用,因爲我們使用Grails 1.3.7獲得的較舊版本的Groovy。有一個解決方法。一旦我進入我的辦公桌,我可以更新它。 – dmahapatro

相關問題