带有JSON参数的Grails域构造函数不起作用

时间:2014-01-13 20:12:58

标签: json grails groovy

我的grails项目中有这样的控制器:

def submit() {
    def json = request.JSON
    Share share = new Share(json)
    share.save(flush: true,  failOnError: true)
}

Class Share看起来像这样:

class Share {

    String timestamp
    String deviceName
    String originMessage

Share(JSONObject originalMessage) {
    println "Run JSON constructor"
    println "$originalMessage"

    originMessage = originalMessage.toString()
    timestamp = originalMessage.timestamp
    deviceName = originalMessage.device
}

它会回收JSON请求并尝试在数据库中保留。

我在我的控制台中遇到failOnError错误:

  • 字段'deviceName'上对象'com.entity.Share'中的字段错误:被拒绝的值[null];
  • 字段'originMessage'上的对象'com.entity.Share'中的字段错误:被拒绝的值[null];码

很多跳舞找到了一种可能的方法:在控制器中将JSON转换为字符串并在构造函数中传递它,其中参数将是String类型,然后使用JSON转换器将其解析回JSON。但为什么我不能正确传递JSON对象作为参数。会发生什么?

1 个答案:

答案 0 :(得分:2)

我没有看到声明这个构造函数的重点,因为域类已经有一个带有Map参数的隐式构造函数。您可以使用JSONObject调用此构造函数,因为此类实现Map,例如

class Share {

    String timestamp
    String deviceName
    String originMessage
}

def json = request.JSON
Share share = new Share(json)

出现这些错误的原因

Field error in object 'com.entity.Share' on field 'deviceName': rejected value [null];
Field error in object 'com.entity.Share' on field 'originMessage': rejected value [null]; codes

是您的JSONObject实例没有名为deviceNameoriginMessage的非空属性。

您需要弄清楚为什么缺少这些属性,或者通过向域类添加以下约束来允许这些属性为空

class Share {

    String timestamp
    String deviceName
    String originMessage

    static constraints = {
        deviceName nullable: true
        originMessage nullable: true 
    }
}