1

grails 用の AWS プラグインを使用しています。メソッドなどのサービスやコントローラーではなく、Groovy クラスから sesMail クロージャーを使用しようとしています。

String msgId = sesMail {

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

sesMail は Groovy クラスのメソッドではないというエラーが表示されます。私の質問は次のとおりです。

  1. 通常のGroovyクラスからgrailsサービスとコントローラーで通常利用可能なプラグインクロージャーを呼び出すにはどうすればよいですか?

  2. それに続いて、これらのクロージャーがどのように定義され、サービスとコントローラーで利用可能になるのか興味があります。プラグインに sesMail の定義が見つかりません。

ありがとう

4

1 に答える 1

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ですresources.groovy。そう:

何かのようなもの:

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

また、上記の方法を直接使用すると、構成がバイパスされることに注意してくださいgrails.plugin.aws.ses.enabled。したがって、明示的に処理する必要があります。

  • ここMetaClassInjectorsesMailで引数として Closure を取るターゲット クラスに対する metaClasses であるメソッドの定義を非常によく見つけることができます。このクラスは、基本的にプラグイン定義から注入/追加するために使用されます。次のように見つけることができますdynamicMethods

AwsGrailsPlugin (行: 37) --> AwsPluginSupport (行: 86) --> MetaClassInjector (行: 50)

また、MetaClassInjector (45 行目と 46 行目あたり) を見ると、ターゲット クラスはコントローラー クラスとサービス クラスです。sesMailしたがって、これら 2 つのアーティファクトで利用可能なクロージャが見つかります。

あなたの好奇心に対処するのに十分明確であることを願っています. :)

于 2013-07-09T23:27:09.190 に答える