gpt4 book ai didi

Grails Command Object : How to load request. JSON 进去了吗?

转载 作者:行者123 更新时间:2023-12-04 01:00:52 25 4
gpt4 key购买 nike

问题 : 有没有办法用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com