【问题标题】:Call grails plugin closure from Groovy class从 Groovy 类调用 grails 插件闭包
【发布时间】:2013-07-09 21:46:35
【问题描述】:

我正在为 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的定义。

谢谢

【问题讨论】:

    标签: grails groovy closures


    【解决方案1】:

    好问题。我很感激您对找到问题的根本原因感到好奇。以下是你的答案:-

    • 您可以直接调用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 行附近)中看到,目标类是控制器和服务类。因此,您会在这 2 个人工制品中找到闭包 sesMail

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

    【讨论】:

    • 很好的答案,谢谢。我遇到的唯一问题是确保 sendSesMail bean 不是单例。默认情况下,作为单例,当多个线程发送电子邮件时,它会导致 to、from 和 cc 地址重叠的大问题。无论如何,通过将范围更改为原型来简单修复。
    • @ConorPower 默认情况下是单例吗?我不这么认为。我认为它是一个普通的实用程序 bean,而不是一个服务类。
    • 插件中的bean定义不是单例的。但是,当我将 bean 定义添加到 resources.groovy 时,它正在创建一个单例实例(与插件中定义的实例不同,因为我必须注入必要的凭据),这就是问题所在。也许我应该将我的 groovy 类声明为 bean 并在其中使用 ref("sendSesMail") 来获取插件 bean?
    猜你喜欢
    • 2013-03-26
    • 2014-07-11
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2014-08-20
    • 1970-01-01
    相关资源
    最近更新 更多