我有一个类似的问题: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,则同样适用。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!