2014-04-24 74 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

關閉課程謝謝! –

相關問題