从Groovy类调用grails插件关闭

时间:2013-07-09 21:46:35

标签: grails groovy closures

我正在使用AWS插件进行grails。我试图使用Groovy类中的sesMail闭包,而不是服务或控制器,例如在方法中:

String msgId = sesMail {

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

我收到一条错误,说sesMail不是Groovy类的方法。我的问题是:

  1. 如何通过常规Groovy类调用grails服务和控制器中通常可用的插件闭包

  2. 接下来我很好奇这些闭包是如何在服务和控制器中定义和提供的。我在插件中找不到sesMail的定义。

  3. 感谢

1 个答案:

答案 0 :(得分: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中定义,否则将在此groovy类中自动装配。这样:

类似的东西:

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

同时通过直接使用上述方法保留注释,您将绕过grails.plugin.aws.ses.enabled配置。所以你必须明确地处理它。

  • 你可以很好地找到sesMail方法的定义,它是metaClasses而不是目标类,在MetaClassInjector中将Closure作为参数。该类主要用于从插件定义中注入/添加dynamicMethods。你可以找到它

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

您还可以在MetaClassInjector(第45和46行)中看到,目标类是控制器和服务类。因此,您可以在这两个人工制品中找到封闭sesMail

我希望能够清楚地解决你的好奇心。 :)