我正在使用AWS插件进行grails。我试图使用Groovy类中的sesMail闭包,而不是服务或控制器,例如在方法中:
String msgId = sesMail {
from props.from
replyTo props.replyTo
to prop.to
html props.body
}
我收到一条错误,说sesMail不是Groovy类的方法。我的问题是:
如何通过常规Groovy类调用grails服务和控制器中通常可用的插件闭包
接下来我很好奇这些闭包是如何在服务和控制器中定义和提供的。我在插件中找不到sesMail的定义。
感谢
答案 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
。
我希望能够清楚地解决你的好奇心。 :)