在“上执行操作”;“有很多”;对象将其插入grails中的新项时
我是Grails的新手,我正在创建我的第一个应用程序,我发现事情发生在哪里有点困难,所以,我有一个对象“cicle”,它有许多“测量”,每次我创建一个新的“测量”,它是由测量控制器创建的,不同的机器,这发生在同一台机器上,cicle的一些属性会发生变化,因此,我在cicle中执行了一个名为updateCalculations的方法,该方法需要新创建的度量的数据 因此,在measurementController中,我试图使用cycle中的测量值执行一些操作,但我得到了一个空指针异常,我猜cicle没有创建,所以我在插入测量对象后将操作移到了方法中,我认为该方法更好,但我也遇到了同样的问题,我甚至认为cicle是创建的,有些是如何初始化的,我不知道到底发生了什么,所以你能帮我吗 这是我的代码: 测量在“上执行操作”;“有很多”;对象将其插入grails中的新项时,grails,groovy,controller,has-many,Grails,Groovy,Controller,Has Many,我是Grails的新手,我正在创建我的第一个应用程序,我发现事情发生在哪里有点困难,所以,我有一个对象“cicle”,它有许多“测量”,每次我创建一个新的“测量”,它是由测量控制器创建的,不同的机器,这发生在同一台机器上,cicle的一些属性会发生变化,因此,我在cicle中执行了一个名为updateCalculations的方法,该方法需要新创建的度量的数据 因此,在measurementController中,我试图使用cycle中的测量值执行一些操作,但我得到了一个空指针异常,我猜cicl
class Measurement{
String machine
int time1
int time2
int time3
int cicleValue
static belongsTo = [cicle: Cicle]
static constraints = {
machine blank:false
time1 nullable:false
time1 min:0
time2 nullable:false
time2 min:0
time3 nullable:false
time3 min:0
cicleValue nullable:false
cicleValue min:0
}
def afterInsert(){
this.cicle.updateCalculations()
}
public void updateCicleValue(){
double avgTime = (time1 + time2 + time3)/3
cicleValue = 30 * 24 * 60 * 60 / avgTime
}
}
Cicle.groovy
class Cicle {
String machine
int cicleValue
static hasMany = [measurements:Measurement]
static constraints = {
machine blank:false
cicleValue nullable:false
}
public void updateCalculations(){
int sumCicles = 0
measurements.each{ measurement ->
sumCicles += measurement.cicleValue
}
cicleValue = sumCicles / measurements.size()
this.save(failOnError: true)
}
}
groovy测量控制器
@Transactional(readOnly = true)
class MeasurementController {
static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"]
def create() {
respond new Measurement(params)
}
@Transactional
def save(Measurement measurementInstance) {
if (measurementInstance == null) {
notFound()
return
}
measurementInstance.updateCicleValue()
Cicle cicle = Cicle.findByMachine(measurementInstance.machine)
if(cicle == null){
cicle = new Cicle(machine: measurementInstance.machine, cicleValue: measurementInstance.cicleValue)
cicle.save flush: true
}
measurementInstance.cicle = cicle
measurementInstance.validate()
if (measurementInstance.hasErrors()) {
respond measurementInstance.errors, view:'create'
return
}
measurementInstance.save flush:true
cicle.measurements << measurementInstance
cicle.save flush: true
request.withFormat {
form multipartForm {
flash.message = message(code: 'default.created.message', args: [message(code: 'measurementInstance.label', default: 'Measurement'), measurementInstance.id])
redirect measurementInstance
}
'*' { respond measurementInstance, [status: CREATED] }
}
}
protected void notFound() {
request.withFormat {
form multipartForm {
flash.message = message(code: 'default.not.found.message', args: [message(code: 'measurementInstance.label', default: 'Measurement'), params.id])
redirect action: "index", method: "GET"
}
'*'{ render status: NOT_FOUND }
}
}
}
它在afterUpdate方法中停止,告知度量值为null
任何帮助都会很好
谢谢这是因为您忘记将
measurementstance
添加到cicle.measurements
。
请尝试在此处保存cicle
实例时添加它:
if(cicle == null){
cicle = new Cicle(machine: measurementInstance.machine, cicleValue: measurementInstance.cicleValue)
cicle.addToMeasurements(measurementInstance) //add to collection
cicle.save flush: true
}
您似乎在某些地方引用了
Ciclo
,而在其他地方引用了Cicle
。。。这些应该是同一件事吗?是的,它们是,我从西班牙语中搜索了代码,现在一切都被更正了。你能发布你的堆栈跟踪吗?是的,当然,我上传了控制台中发生的事情HI tks!我试着用cicle来做。测量leftshift运算符并没有过载,它不应该这样做。对于这种情况,有一些特别的动态方法。顺便说一句,你能投票支持我的回答吗?我只需要再多投4分就可以得到其他答案:)
if(cicle == null){
cicle = new Cicle(machine: measurementInstance.machine, cicleValue: measurementInstance.cicleValue)
cicle.addToMeasurements(measurementInstance) //add to collection
cicle.save flush: true
}