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)
然后,您可以通过正则表达式/命名约定将此过滤器扩展到任何适用的控制器操作.
| 归档时间: |
|
| 查看次数: |
6318 次 |
| 最近记录: |