2014-04-24 116 views
0

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

它在更新后的方法告诉测量其空

停止任何帮助将是巨大的

感谢

+0

你似乎引用'Ciclo'在一些地方和'Cicle'在别人......难道这些应该是同样的事情? –

+0

是的,我翻译了西班牙语的代码,现在一切都被修正了 –

+0

你可以发布你的堆栈跟踪吗? – rmlan

回答

1

这是东阳你忘了添加measurementInstancecicle.measurements。 有一个尝试,并添加在这里保存cicle实例时:

if(cicle == null){ 
     cicle = new Cicle(machine: measurementInstance.machine, cicleValue: measurementInstance.cicleValue) 
     cicle.addToMeasurements(measurementInstance) //add to collection 
     cicle.save flush: true 
    } 
+0

嗨!我试图做到这一点cicle.measurements << measurementInstance但它不起作用,你现在为什么? –

+0

左移操作符不会超载,它不应该这样做。这种情况下有特殊的动态方法[Grails文档](http://grails.org/doc/2.3.7/ref/Domain%20Classes/addTo.html)BTW你可以投我的回应吗?我只需要4分多投其他答案:) – mordka

+0

关闭课程谢谢! –

相关问题