Grails命令对象:如何将request.JSON加载到其中?

Joh*_*don 12 grails grails-controller

问题:有没有办法用request.JSON数据进行自动命令对象绑定?

在我的grails控制器中给出这个简单的Command对象:

class ProfileCommand{

int id
String companyName

static constraints = {
    companyName blank: false
    id nullable: false
}

@Override
public String toString() {
    return "ProfileCommand{id=$id, companyName='$companyName'}";
}
}
Run Code Online (Sandbox Code Playgroud)

和我的控制器方法签名:

def update(ProfileCommand command) {...}

如何将request.JSON数据存入我的命令对象?

到目前为止,我能够做到的唯一方法是在update()方法中手动创建命令对象,传递request.JSON作为构造函数参数:

    def command = new ProfileCommand(request.JSON)

    log.debug "Command object contents: $command"
Run Code Online (Sandbox Code Playgroud)

上面的debug命令产生:

Command object contents: ProfileCommand{id=1, companyName='Blub Muckers'}
Run Code Online (Sandbox Code Playgroud)

这正是我想要的(对于上述解决方案,Oliver Tynes大声喊出来).不幸的是,command.validate()在创建命令后调用会产生以下异常:

Class org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException
Message Tag [validate] is missing required attribute [form]
Run Code Online (Sandbox Code Playgroud)

我正在使用v2.0.3,uris产生了与v2.0.4相同的异常.

更新 Grails邮件列表中的每个Ian Roberts,您需要将@Validateable注释添加到命令类才能开始validate()工作.谢谢,伊恩!

小智 7

我不确定是否有任何配置方式来执行自动JSON参数数据绑定; 您可以做的一件事是为您的操作编写一个过滤器,该过滤器接受JSON请求输入,基本上将request.JSON重新映射到根参数映射,理论上应允许自动数据绑定发生.

就像是:

class JSONParamMapFilters {
  def filters = {
     before = {
        remapFilter(controller:'yourController', action:'update') {
           request.JSON.each { k,v ->
               params[k] = v
           }
        }
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过正则表达式/命名约定将此过滤器扩展到任何适用的控制器操作.