我有一个类似的问题:Grails get child domain objects
我将从链接中粘贴域类代码,以使帖子更具可读性:
class Parent{
String name
static hasMany = [childs:Child]
static constraints = {
}
}
class Child{
String name
static belongsTo = [parent:Parent]
static constraints={}
}
我已经为 Parrent 对象创建了自定义编码器,它产生如下所示的内容。
如何接收和保存一个复杂的 JSON 对象? (我想收到与 marshaller 为我生成的对象相同的对象)
[{"class":"project.Parent","id":1,"name":"name1",
"childs":[{"class":"Child","id":1,"name":"childname1"},
{"class":"Review","id":2,"name":"childname2"}
]
}]
除了 JSON,如果我有所有参数,比如“名称”等,我的应用程序中的默认保存代码是:
def parrent = new Parrent("parr_name")
parrent.save()
def child = new Child("child_name", parrent)
child.save()
我必须单独发送 JSON 对象吗?还是我可以只接收复杂的 json 并拖出 args map ?以这种方式实现显示 JSON 的编码器是否能够接收类似格式的编码器?
我正在使用 grails v2.3.3
请您参考如下方法:
Grails 2.3.* 附带了一个重新定义的数据绑定(bind)框架,您可以在其中将 JSON 有效负载(大多数情况下来自 POST 请求)直接绑定(bind)到域类。
它的工作方式与您为响应 JSON 定制编码器相同。一路CommandObjects在早期版本的 Grails 中使用过,同样可以使用。以你自己的例子:
class Parent {
String name
static hasMany = [children:Child]
}
class Child {
String name
static belongsTo = [parent:Parent]
}
//In Controller
class ParentController {
//Directly binding the payload JSON to Parent domain class
//Caveat here is if the corresponding Parent domain matching the id in the
//payload is not found then "parent" parameter
//in the below action will be null
def save(Parent parent) {
println "Parent Data $parent"
println "Child Data $parent.children"
render "Parent Data $parent and child data $parent.children"
//or Do other stuff
}
}
//Assuming you have parent and child already present
class BootStrap {
def init = { servletContext ->
def parent = new Parent(name: "name1")
def child1 = new Child(name: "childname1")
def child2 = new Child(name: "childname2")
parent.addToChildren(child1)
parent.addToChildren(child2)
parent.save(flush: true, failOnError: true)
}
}
//and payload as
POST http://localhost:8080/YourApp/parent/save
Content-Type: application/json
{"class":"project.Parent","id":1,"name":"name1",
"childs":[{"class":"Child","id":1,"name":"childname1"},
{"class":"Child","id":2,"name":"childname2"}
]
}
//curl command like
curl -X POST
-H "Content-Type: application/json"
-d '{"class":"project.Parent","id":1,"name":"name1",
"childs":[{"class":"Child","id":1,"name":"childname1"},
{"class":"Child","id":2,"name":"childname2"}
]
}'
http://localhost:8080/YourApp/parent/save
您应该能够将 JSON 有效负载绑定(bind)到
Parent域(有 child )直接。如果您使用 url 参数而不是 JSON,则同样适用。




