Skip to content

GPMONGODB-73: beforeUpdate() with embedded hasMany relationship cause IllegalArgumentException: can't serialize class #504

@graemerocher

Description

@graemerocher

Original Reporter: ratler
Environment: Linux, Grails 1.3.7, Sun JDK 1.6.0_26
Version: 1.0.0.M6
Migrated From: http://jira.grails.org/browse/GPMONGODB-73

When using beforeUpdate() in a domain class that has an embedded hasMany relationship the following exception is thrown:

java.lang.IllegalArgumentException: can't serialize class blah.Address
at org.bson.BSONEncoder._putObjectField(BSONEncoder.java:214)
at org.bson.BSONEncoder.putIterable(BSONEncoder.java:239)
at org.bson.BSONEncoder._putObjectField(BSONEncoder.java:182)
at org.bson.BSONEncoder.putObject(BSONEncoder.java:124)
at org.bson.BSONEncoder.putObject(BSONEncoder.java:70)
at com.mongodb.OutMessage.putObject(OutMessage.java:189)
at com.mongodb.DBApiLayer$MyCollection.update(DBApiLayer.java:334)
at org.springframework.datastore.mapping.mongo.engine.MongoEntityPersister$5.doInDB(MongoEntityPersister.java:404)
at org.springframework.data.document.mongodb.MongoTemplate.execute(MongoTemplate.java:293)
at org.springframework.datastore.mapping.mongo.engine.MongoEntityPersister.updateEntry(MongoEntityPersister.java:391)
at org.springframework.datastore.mapping.mongo.engine.MongoEntityPersister.updateEntry(MongoEntityPersister.java:69)
at org.springframework.datastore.mapping.engine.NativeEntryEntityPersister$2.run(NativeEntryEntityPersister.java:428)
at org.springframework.datastore.mapping.core.impl.PendingOperationExecution.executePendingInsert(PendingOperationExecution.java:32)
at org.springframework.datastore.mapping.core.AbstractSession.flushPendingOperations(AbstractSession.java:235)
at org.springframework.datastore.mapping.core.AbstractSession.flushPendingUpdates(AbstractSession.java:212)
at org.springframework.datastore.mapping.core.AbstractSession.flush(AbstractSession.java:196)
at org.grails.datastore.gorm.support.DatastorePersistenceContextInterceptor.flush(DatastorePersistenceContextInterceptor.java:90)
at Console$_run_closure3_closure7_closure9.doCall(Console:83)
at Console$_run_closure3_closure7.doCall(Console:82)
at Console$_run_closure3_closure7.doCall(Console)

Domain classes used to reproduce the issue:

{code:title=User.groovy}
package blah

import org.bson.types.ObjectId

class User {
ObjectId id
String name
List

addresses

static embedded = ['addresses']
static hasMany = [addresses:Address]

static constraints = {
}

def beforeUpdate() {
    this.name = name.toLowerCase()
}

}
{code}

{code:title=Address.groovy}
package blah

class Address {
String type
String identifier

static constraints = {
}

}
{code}

To reproduce the issue run this snippet twice in grails console
{code}
package blah

user = User.findByName("ratler")
if (!user) {
user = new User(name: "ratler")
}
address = new Address(address1:"Test")
user.addToAddresses(address)
user.save(flash: true)
{code}

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions