我的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错误:
很多跳舞找到了一种可能的方法:在控制器中将JSON转换为字符串并在构造函数中传递它,其中参数将是String类型,然后使用JSON转换器将其解析回JSON。但为什么我不能正确传递JSON对象作为参数。会发生什么?
答案 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
实例没有名为deviceName
或originMessage
的非空属性。
您需要弄清楚为什么缺少这些属性,或者通过向域类添加以下约束来允许这些属性为空
class Share {
String timestamp
String deviceName
String originMessage
static constraints = {
deviceName nullable: true
originMessage nullable: true
}
}