如何将参数传递到我从 gsp 获得的服务以及我在 Grails 的控制器中拥有的服务

How to pass params into Services that I get from the gsp and I have in my Controller in Grails

当我调用方法 save() 时,我得到了用户在我的控制器中的 g:textField 中输入的参数,我需要在我的服务中使用这个值。我怎样才能将控制器中的参数传递给我的服务,或者可以将这些数据从我的 gsp 直接传递到我的服务?

我试图传递等于 gsp-Controller 的参数当我试图访问我的服务中的参数时,我得到一个错误:No such 属性: params

普惠制:

<g:textField name="enterEmail" required=""/>

控制器:

save(){
    def enterMail = params.enterEmail   
}

服务:

def sendYourEmail(EmailTemplate emailTemplateInstance){     
    ....            
    def enterMail = params.enterEmail   
    log.info "Sending email"
    String source = 'myEmail'
    Destination destination = new Destination([enterMail])
    Content subject = new Content('test')
    Body body = new Body().withHtml(new Content(output.toString()))
    Message message = new Message(subject, body)
    amazonWebService.ses.sendEmail(new SendEmailRequest(source, destination, message))  
}

params 作为参数传递给您的服务方法,因为它只能从控制器或标签库访问

更新:

代码示例

控制器

def yourService
def save(){
  service.sendYourEmail emailTemplateInstance, params
}

服务:

def sendYourEmail( EmailTemplate emailTemplateInstance, params ){
   def enterMail = params.enterEmail
   ....
}

您在控制器中使用的 params 属性是 Grails 在运行时为您添加的动态属性。您不能使用服务 class.

从服务中获取参数是个坏主意,但您可以使用以下行来做到这一点:

org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes().params

一个好主意是使用一个命令:一个简单的 groovy/java 对象,您的参数从请求中绑定,然后将此命令发送到服务。这样做,您将删除服务 class(业务层)和参数映射(Web 层)之间的依赖关系:它将更容易测试和从其他部分重用(您可以根据需要创建命令)。

命令:

class MailCommand {
    String enterEmail
}

控制器:

def mailService
def save(MailCommand mailCommand){
    mailService.sendYourEmail(mailCommand, mailTemplate)
}

邮件服务class:

def sendYourEmail(MailCommand mailCommand, EmailTemplate emailTemplateInstance){
    def enterMail = mailCommand.enterEmail   
    ...
}

更多信息:http://grails.github.io/grails-doc/latest/guide/single.html#commandObjects