Skip to content

GPMONGODB-30: .save() fails with NPE after Domain.get(new ObjectId(params.id)) is used and if "version" field is missing #484

@graemerocher

Description

@graemerocher

Original Reporter: oct
Environment: mongodb 1.8.1, linux, 1.0.0-M5, grails 1.3.7
Version: Not Specified
Migrated From: http://jira.grails.org/browse/GPMONGODB-30

It happens if I use .get() to create the instance and the mongo document is missing "version" field. It's missing because I've upgraded to M5 and already had the collection...

It works fine though if instead of .get(new ObjectId(params.id)) I use .findById(new ObjectId(params.id))

To get by this collection should be updated by adding version:0 field.

{code}
2011-04-19 20:40:13,799 [http-8080-1] ERROR errors.GrailsExceptionResolver - Exception occurred when processing request: [POST] /page/create - parameters:
id: 4d66c1f5c9b62d1d123921e8
body: body
enabled: on
title: terms
_action_update: Save page
_enabled:
url: terms
Stacktrace follows:
java.lang.NullPointerException
at org.grails.datastore.gorm.GormInstanceApi.doSave(GormInstanceApi.groovy:169)
at org.grails.datastore.gorm.GormInstanceApi.this$dist$invoke$4(GormInstanceApi.groovy)
at org.grails.datastore.gorm.GormInstanceApi$4.methodMissing(GormInstanceApi.groovy)
at org.grails.datastore.gorm.GormInstanceApi$4.doInSession(GormInstanceApi.groovy:143)
at org.grails.datastore.gorm.SessionCallback$doInSession.call(Unknown Source)
at org.grails.datastore.gorm.SessionCallback$doInSession.call(Unknown Source)
at org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:37)
at org.grails.datastore.gorm.GormInstanceApi.save(GormInstanceApi.groovy:141)
at org.grails.datastore.gorm.InstanceMethodInvokingClosure.call(GormEnhancer.groovy:219)
at me.yeay.PageController$_closure7.doCall(PageController.groovy:62)
at me.yeay.PageController$_closure7.doCall(PageController.groovy)
at java.lang.Thread.run(Thread.java:662)

//=======================================================================

import java.util.Date

import org.bson.types.ObjectId

class Page {
ObjectId id

String title
String body
String url

Date dateCreated
Date dateUpdated
String createdBy

Boolean enabled = true

static mapWith = "mongo"

static constraints = {
    title(blank:false)
    url(blank:false)
    dateUpdated(nullable:true)
    body(nullable:true)
    createdBy(blank:false)
}

static mapping = {
    url index:true, indexAttributes: [unique:true, dropDups:true]
}

}

//=================================================================================
def update = {
def pageInstance = Page.get(new ObjectId(params.id))
if (pageInstance) {
pageInstance.properties = params
pageInstance.dateUpdated = new Date()

        if (!pageInstance.hasErrors() && pageInstance.save(flush: true)) {  // <===== line 62, fails here
            flash.message = "${message(code: 'page.saved')}"
            redirect(action: "list")
        } else {
            render(view:'form', model:[page: pageInstance, nextAction:'update'])
        }
    } else {
        flash.message = "${message(code: 'page.not.found')}"
        redirect(action: "list")
    }
}

{code}

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions