问题 : 有没有办法用 request.JSON 数据自动绑定(bind)命令对象?
鉴于我的 grails Controller 中的这个简单的 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'}";
}
}
和我的 Controller 方法签名:
def update(ProfileCommand command) {...}
我怎样才能得到
request.JSON
数据到我的命令对象?到目前为止,我能够做到的唯一方法是在
update()
中手动创建命令对象。方法,传入 request.JSON 作为构造函数参数: def command = new ProfileCommand(request.JSON)
log.debug "Command object contents: $command"
上面的调试命令产生:
Command object contents: ProfileCommand{id=1, companyName='Blub Muckers'}
这正是我想要的(为上述解决方案向 Oliver Tynes 大喊大叫)。不幸的是,调用
command.validate()
在我创建命令后会产生以下异常:Class org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException
Message Tag [validate] is missing required attribute [form]
我正在使用 v2.0.3,uris 产生了与 v2.0.4 相同的异常。
更新
根据 Grails 邮件列表中的 Ian Roberts,您需要添加
@Validateable
注释命令类以获得 validate()
去工作。谢谢,伊恩!
最佳答案
我不确定是否有任何配置方式可以进行自动 JSON 参数数据绑定(bind);您可能能够做的一件事是为您的操作编写一个过滤器,该过滤器采用 JSON 请求输入,基本上将 request.JSON 直接重新映射到根参数映射,理论上这应该允许自动数据绑定(bind)发生。
就像是:
class JSONParamMapFilters {
def filters = {
before = {
remapFilter(controller:'yourController', action:'update') {
request.JSON.each { k,v ->
params[k] = v
}
}
}
}
}
然后,您可以通过正则表达式/命名约定将此过滤器扩展到任何适用的 Controller 操作。
关于Grails Command Object : How to load request. JSON 进去了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10834422/