我是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