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,所以它不会在这个 groovy 类中自动装配,除非你在resources.groovy. 所以:

就像是:

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

还请注意,直接使用上述方法将绕过grails.plugin.aws.ses.enabled配置。所以你必须明确地处理它。

  • 您可以在MetaClassInjector中很好地找到方法的定义,sesMail该方法是 metaClasses over target classes 将 Closure 作为参数。此类基本上用于从插件定义中注入/添加。你可以找到它dynamicMethods

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

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

我希望它足够清楚以解决您的好奇心。:)

于 2013-07-09T23:27:09.190 回答