grails对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例

时间:2015-12-07 20:55:03

标签: grails

我知道这个问题在Stackoverflow中有很多问题,但即使它有很多答案,但这些答案根本无法帮助我,而且要么想出来。

在我的WebAPP中,它工作正常,但当我将其转换为API时,它失败了(主题标题错误)...我试过以下:

  

保存第一个Test(flush:true)//错误C必须是NOT NULL

     

保存testInstance.addToAs(a).save()// b和c

为什么我无法保存整个对象?

Domain Water

static hasMany = [personWaters   : Person,
                  equipmentWaters: Equipment,
                  sampleWaters   : WaterSample]

Domain WaterSample

static belongsTo = [water: Water]

控制器重构了一些部分

def save() {
    def waterParams = request.JSON
    def sampleList = [] as Set
    def equipmentList = [] as Set
    def personList = [] as Set

    waterAPIService.personPopulate(waterParams.personWaters, personList)
    waterAPIService.equipmentPopulate(waterParams.equipmentWaters, equipmentList)
    waterAPIService.samplePopulate(waterParams.sampleWaters, sampleList)

    Date validity = Date.parse("yyyy-MM-dd'T'HH:mm:ss'Z'", waterParams.validity)
    Date sample = Date.parse("yyyy-MM-dd'T'HH:mm:ss'Z'", waterParams.sampleDate)

    waterParams.remove('personWaters')
    waterParams.remove('equipmentWaters')
    waterParams.remove('sampleWaters')
    waterParams.remove('validity')
    waterParams.remove('sampleDate')

    waterParams.put('personWaters', personList)
    waterParams.put('equipmentWaters', equipmentList)
    waterParams.put('sampleWaters', sampleList)

    waterParams.put('validity', validity)
    waterParams.put('sampleDate', sample)

    def waterInstance = new Water(waterParams)

    //def test = waterAPIService.sampleValidated(sampleList ? sampleList.size() : 0, sampleList)
    def test = 99
    if (test == 99) {
        if (saveTest(waterInstance)) {
            render([message: ['ok']] as JSON)
        } else {
            def errors = []
            errors.add('Erro ao salvar')
            errors = waterInstance.errors.allErrors.collect { g.message([error: it]) }
            render([message: errors] as JSON)
        }
    } else {
        render render([message: ["Critério de estabilização não atendido para o parâmetro " + waterAPIService.messageSampleValidated(test)]] as JSON)
    }
}

def saveTest(Water waterInstance) {
    try {
        println waterInstance.validate()
        if (!waterInstance.hasErrors() && waterInstance.save() && waterInstance.validate()) {
            return true
        } else {
            log.info("error", waterInstance.errors)
            return false
        }
    } catch (e) {
        log.info("exception error", e)
    }
}

服务

def personPopulate(personWaters, personList) {
    personWaters.each {
        personList <<  Person.get(it.id)
    }
    return personList
}

def equipmentPopulate(equipmentWaters, equipmentList) {
    equipmentWaters.each {
        equipmentList << Equipment.get(it.id)
    }
    return equipmentList
}

def samplePopulate(sampleWaters, sampleList) {
    sampleWaters.each {
        def sample = new WaterSample()
        sample.dateTime = Date.parse("yyyy-MM-dd'T'HH:mm:ss", it.dateTime)
        sample.levelWater = it.levelWater
        sample.conductivity = it.conductivity
        sample.dissolvedOxygen = it.dissolvedOxygen
        sample.redoxPotential = it.redoxPotential
        sample.ph = it.ph
        sample.temperature = it.temperature
        sampleList << sample
    }
    return sampleList
}

waterParam JSON

{  
"climateCondition":"SUNNY",
"equipmentWaters":[  
   {  
      "id":2
   },
   {  
      "id":4
   }
],
"personWaters":[  
   {  
      "id":86
   },
   {  
      "id":143
   }
],
"sampleWaters":[  
   {  
      "ReportId":2,
      "conductivity":0,
      "IDWeb":0,
      "dissolvedOxygen":0,
      "dateTime":"2015-12-07T17:08:00Z",
      "levelWater":0,
      "ID":4,
      "UpdateDate":"0001-01-01T00:00:00Z",
      "ph":0,
      "redoxPotential":0,
      "temperature":0
   },
   {  
      "ReportId":2,
      "conductivity":0,
      "IDWeb":0,
      "dissolvedOxygen":0,
      "dateTime":"2015-12-07T17:09:00Z",
      "levelWater":0,
      "ID":5,
      "UpdateDate":"0001-01-01T00:00:00Z",
      "ph":0,
      "redoxPotential":0,
      "temperature":0
   },
   {  
      "ReportId":2,
      "conductivity":0,
      "IDWeb":0,
      "dissolvedOxygen":0,
      "dateTime":"2015-12-07T18:13:00Z",
      "levelWater":0,
      "ID":6,
      "UpdateDate":"0001-01-01T00:00:00Z",
      "ph":0,
      "redoxPotential":0,
      "temperature":0
   }
]
}

1 个答案:

答案 0 :(得分:0)

好的,找到解决方案之一是一件令人头疼的问题:

如果您尝试保存对象,请调试它并检查任何嵌套对象,例如:我正在发送approval.id:null,该对象将在下面给我:

“批准”:{
      “类”:“用户”,       “ID”:空    },

尝试添加id为null的用户,找不到并且不会保存。所以从你的json请求中删除它。