2013-07-09 68 views
1

我正在使用適用於grails的AWS插件。我正嘗試使用Groovy類中的sesMail閉包,而不是服務或控制器,例如在一個方法中:從Groovy類調用grails插件關閉

String msgId = sesMail { 

      from props.from 
      replyTo props.replyTo 
      to prop.to 
      html props.body 
     } 

我得到一個錯誤,說sesMail不是一個Groovy類的方法。我的問題是:

  1. 我怎麼能調用一個插件的閉包是這些蓋子是如何定義並提出在Grails的服務,從一個普通的Groovy類

  2. 控制器此之後我很好奇,通常可用在服務和控制器中可用。我無法在插件中找到sesMail的定義。

感謝

回答

2

很好的問題。我很欣賞你很想找到你的問題的根源。這裏是你的答案: -

  • 您可以直接致電SendSesMail bean來發送郵件,而不是調用sesMail關閉。你的Groovy類會是什麼樣子:

    class MyGroovyClass{ 
        def sendSesMail 
    
        def sendSomeMails(){ 
         String msgId = sendSesMail.send{ 
           from props.from 
           replyTo props.replyTo 
           to prop.to 
           html props.body 
         } 
        } 
    } 
    

    正如你所看到SendSesMail不是服務類,這只是一個POGO,所以它會將這個Groovy類自動裝配,除非你定義在resources.groovy。所以:

喜歡的東西:

//resources.groovy 
beans = { 
    sendSesMail(grails.plugin.aws.ses.SendSesMail) 
} 

另外,通過採用上述方法直接你會繞過grails.plugin.aws.ses.enabled配置保持一個音符。所以你必須明確處理它。

  • 可以很好地找到sesMail方法,該方法是在目標類的元類中MetaClassInjector採取封閉作爲參數在這裏的定義。該類基本上用於從插件定義中注入/添加dynamicMethods。你可以找到它爲

AwsGrailsPlugin(線路:37) - >AwsPluginSupport(線路:86) - >MetaClassInjector(線路:50)

您還可以看到在MetaClassInjector(約45行和46),目標類是控制器和服務類。因此,您可以在這兩個工件中找到關閉sesMail

我希望已經足夠清楚地解決你的好奇心了。 :)

+0

偉大的答案謝謝。我遇到的唯一問題是確保sendSesMail bean不是單例。作爲默認情況下的單身人士,當多個線程發送電子郵件時,它會引起與to,from和cc地址重疊的大問題。無論如何,通過將範圍更改爲原型來簡單修復。 –

+0

@ConorPower默認情況下它是單身嗎?我不這麼認爲。我認爲這是一個普通的實用bean,而不是服務類。 – dmahapatro

+0

插件中的bean定義不是單例。然而,當我將bean定義添加到resources.groovy時,它創建了一個單例實例(與插件中定義的實例不同,因爲我必須注入必要的證書),這就是問題出現的地方。也許我應該把我的groovy類聲明爲一個bean,並在那裏使用ref(「sendSesMail」)來獲得插件bean? –