在 grails 中使用 HTTP GET 调用时,字段值呈现为空

Posted

技术标签:

【中文标题】在 grails 中使用 HTTP GET 调用时,字段值呈现为空【英文标题】:Field values rendered null when using HTTP GET call in grails 【发布时间】:2014-07-17 08:01:25 【问题描述】:

这是 Person 的域类:

 package com.sample
 class Person 
    String id
    String name
    Integer age
    Address address
static hasMany = [pets:Pet, alias: String, aliases : Alias]

static mapWith = "mongo"
 static constraints = 
      address nullable:true
      pets nullable :true
 

这是地址的域类:

 package com.sample

 class Address 

   String address
   static mapWith = "mongo"
   static constraints = 
           address maxSize: 1000
   
 

这是 PersonController 中的 ShowPerson 方法:

 def showPerson(String name,String age)

            if(Person.findByAgeAndName(age,name) != null) 
                    render Person.findByAgeAndName(age,name) as JSON
            
            else 

                def addobj = new Address(address: "kondapur")
                addobj.save(flush:true)

                def pet1 = new Pet(name : "Dog", breed : "A")
                pet1.save(flush:true)

                def alias1 = "ALIAS1"
                def alias2 = "ALIAS2"

                def list = ["A"]
                def aliases1 = new Alias(aliasname : [list])
                aliases1.save(flush:true)

                def person = new Person(name : name, age : age,  address : addobj, pets : [pet1], alias : [alias1, alias2], aliases : [aliases1])

                person.save()   

                render person as JSON
            

        

最初数据库中没有人员(这意味着Person.findByAgeAndName(age,name) == null)因此它创建一个新对象并将其保存在数据库中)。所以当我点击网址时

 > http://localhost:8080/TestJson/showPerson/sample/23

现在的输出是:

现在当我重新点击同一个 url 时(暗示 Person.findByAgeAndName(age,name) != null) 因此它从数据库中获取):

现在的输出是:

在数据库中地址保存为:

在数据库中,人被保存为:

谁能告诉我,当我尝试从数据库中获取保存的对象时(即在本例中为 kondapur 而不是 null),我如何才能将地址​​(以红色圈起来)设为非 null 并获取相应的值

【问题讨论】:

好问题详解+1 我在Address 中看不到name 字段。 域类地址中的“字符串地址”是我所指的 【参考方案1】:

Grails JSON marshaller 默认不添加嵌套类,你要添加一行代码:

     def showPerson(String name,String age)

   JSON.use('deep')// <============================== Add this line

                if(Person.findByAgeAndName(age,name) != null) 
                        render Person.findByAgeAndName(age,name) as JSON
                
            else 

                def addobj = new Address(address: "kondapur")
                addobj.save(flush:true)

                def pet1 = new Pet(name : "Dog", breed : "A")
                pet1.save(flush:true)

                def alias1 = "ALIAS1"
                def alias2 = "ALIAS2"

                def list = ["A"]
                def aliases1 = new Alias(aliasname : [list])
                aliases1.save(flush:true)

                def person = new Person(name : name, age : age,  address : addobj, pets : [pet1], alias : [alias1, alias2], aliases : [aliases1])

                person.save()   



                render person as JSON
            

        

【讨论】:

即使加上我得到地址的名称字段为空。是不是因为地址表没有通过外键链接到人员表? 你得到了地址 id,所以 Person 有地址引用,但是如果你删除 Person,地址没有 Person 引用,地址将继续存在(你将在DB ),但这是另一个问题。 我正在获取地址 ID,但为什么我没有获取地址名称?如果人有地址引用为什么我在地址表中删除该特定地址时地址不显示为空? 如果你想要一个双向引用,你应该在你的地址域类中添加:static belongsTo = [person: Person]。 控制器中的对象有地址引用(它是延迟加载的,但如果你尝试获取它,你会的)当该 java(groovy) 对象转换为 json 时,json 表示将不包含地址对象。

以上是关于在 grails 中使用 HTTP GET 调用时,字段值呈现为空的主要内容,如果未能解决你的问题,请参考以下文章

grails无法在此处发出重定向(..)。当url参数包含尖括号时,先前调用重定向(..)

在 grails 应用程序中调用 spring security rest 插件登录时出现 401 未经授权的错误

在grails中远程调用action

如何在 grails 应用程序中使用 API

Grails - 跨控制器代码,在每个请求上执行

Grails,在 AJAX 调用中处理会话超时