我是Grails的新手,我正在創建我的第一個應用程序,並且在查找事件發生的位置時遇到了一些問題,所以,我有一個對象「cicle」,有許多「測量」,並由測量控制器創建,每次創建一個新的「測量」,一個不同的機器,這發生在同一臺機器上,cicle的一些屬性發生變化,所以,我執行一種叫做updateCalculations的方法,需要新創建的度量數據。當在grails中插入一個新項目時對「hasMany」對象執行操作
所以在measurementController我試圖執行一些使用週期測量的操作,但我得到一個空指針異常,我猜測cicle沒有創建,所以我將操作移到了方法afterInsert在Measurement對象中的一個地方我雖然這種方法可能會更好,但是我在那裏也遇到了同樣的問題,我甚至認爲cicle已經創建了購買測量,一些未初始化的東西,我不知道發生了什麼,所以你能幫助我嗎?
這是我的代碼:
Measurement.groovy
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)
}
}
MeasurementController.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 }
}
}
}
這裏是從堆棧跟蹤缺點獨家:
|Loading Grails 2.3.7
|Configuring classpath
.
|Environment set to development
.................................
|Packaging Grails application
...........
|Compiling 1 source files
...............................
|Running Grails application
|Server running. Browse to http://localhost:8080/mock-app
....Error
|
2014-04-24 21:51:34,719 [http-bio-8080-exec-3] ERROR errors.GrailsExceptionResolver - NullPointerException occurred when processing request: [POST] /mock-app/measurement/save - parameters:
time3: 20
time2: 20
time1: 20
machine: 2-12
create: Crear
Cannot invoke method size() on null object. Stacktrace follows:
Message: Cannot invoke method size() on null object
Line | Method
->> 23 | updateCalculations in com.rpc.mock.app.Cicle
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 26 | afterInsert in com.rpc.mock.app.Measurement
| 153 | call . . . . . . . in org.grails.datastore.gorm.support.EventTriggerCaller$MethodCaller
| 96 | call in org.grails.datastore.gorm.support.EventTriggerCaller
| 47 | onApplicationEvent in org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener
| 51 | $tt__save in com.rpc.mock.app.MeasurementController
| 200 | doFilter . . . . . in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter
| 1145 | runWorker . . . . in java.util.concurrent.ThreadPoolExecutor
| 615 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 744 | run . . . . . . . in java.lang.Thread
它在更新後的方法告訴測量其空
停止任何幫助將是巨大的
感謝
你似乎引用'Ciclo'在一些地方和'Cicle'在別人......難道這些應該是同樣的事情? –
是的,我翻譯了西班牙語的代碼,現在一切都被修正了 –
你可以發佈你的堆棧跟蹤嗎? – rmlan