【问题标题】:Grails - Can't add child record to parentGrails - 无法将子记录添加到父记录
【发布时间】:2012-12-14 21:14:30
【问题描述】:

尝试按照here 显示的示例我正在尝试创建一个链接到父记录的记录。

就我而言,我有两个类:传感器和读数。我可以毫无问题地创建传感器,但无论我如何尝试创建读数,我似乎都失败了:(

我已经转轮子够久了,我认输了,希望有人能发现我的愚蠢错误。

还有一件事 - 我想使用 JSON 发布数据。但是通过调试过程,我什至没有查看 JSON 值,我已经对它们进行了硬编码,但它仍然无法正常工作。

ReadingsController.groovy

package grailshelloworld

import grails.converters.JSON
import groovy.json.JsonSlurper

class ReadingsController {

    def scaffold=Readings

        def save = {

                def slurper = new JsonSlurper()
                def result = slurper.parseText(request.reader.text)

                def s = new Sensor (sensorid: "SID", sensorname: "name", sensordescription: "description")
                        .addToReadings(reading: "blah")
                        .save()

                render ([ok: false] as JSON)


    }
}

sensor.groovy

package grailshelloworld

class Sensor {

    String sensorid
    String sensorname
    String sensordescription

    static hasMany = [readings: Readings]

    static constraints = {
        sensorid blank:false, nullable: false 
        sensorname blank:false, nullable: false
    }
}

Readings.grooovy

package grailshelloworld
import java.util.Formatter.DateTime;
class Readings {
    String reading
    static belongsTo = [sensor: Sensor]
}

当前错误:参数类型不匹配...

<dt>Class</dt><dd>java.lang.IllegalArgumentException</dd><dt>Message</dt><dd>argument type mismatch</dd></dl><h2>Around line 15 of <span class="filename">grails-app/controllers/grailshelloworld/ReadingsController.groovy</span></h2>
<pre class="snippet"><code class="line"><span class="lineNumber">12:</span>     def slurper = new JsonSlurper()</code><code class="line"><span class="lineNumber">13:</span>        def result = slurper.parseText(request.reader.text)</code><code class="line"><span class="lineNumber">14:</span></code><code class="line error"><span class="lineNumber">15:</span>     def s = new Sensor (sensorid: &quot;SID&quot;, sensorname: &quot;name&quot;, sensordescription: &quot;description&quot;)</code><code class="line"><span class="lineNumber">16:</span>           .addToReadings(reading: &quot;blah&quot;)</code><code class="line"><span class="lineNumber">17:</span>          .save()</code><code class="line"><span class="lineNumber">18:</span></code></pre><h2>Around line 195 of <span class="filename">PageFragmentCachingFilter.java</span></h2>

【问题讨论】:

  • addToReadings 不会将孩子添加到父母中吗?你称它为Sensor,它是父母。也许您应该创建一个Readings 并将其添加到Sensor
  • 你能告诉我们你的JSON是什么样的吗?由于错误出现在您的 parseText 调用上,因此可能是 JSON 的问题。
  • @nidu - 在引发错误之前,代码甚至还没有走那么远。并且 grails 允许使用这种语法,只要带有 reading: "blah" 的读数确实存在。
  • 这里是 curl 命令以及 JSON: curl -X POST --header "Content-Type: application/json" --data-binary '{"sensorid": "28-JSON- ABC", "collectorname": "collector.attic.pisdr", "reading": 93.3, "id": 43}' localhost:8080/GrailsHelloWorld/readings/save;回声“”

标签: grails grails-orm


【解决方案1】:

您是否尝试过显式创建一个新的Readings

def s = new Sensor (sensorid: "SID", sensorname: "name", sensordescription: "description")
                    .addToReadings(new Readings(reading: 'blah'))
                    .save()

错误是“第 15 行附近”,这是 def s = ... 语句的开始。

我知道文档说可以按照您尝试的方式完成 - 但值得一试。

【讨论】:

  • 成功了!感谢您节省了无数小时的敲打我的头!
猜你喜欢
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 2014-05-17
相关资源
最近更新 更多