Skip to content

Domain classes with a Map property fails with GroovyCastException on delete from MongoDB #615

@dmahapatro

Description

@dmahapatro

*Grails 3.1.0.RC1
*org.grails.plugins:mongodb:5.0.0.RC3

Example Domain:

class Product {
    static mapWith = "mongo"

    String id
    String name
    Map characteristics

    static embedded = ['characteristics']
}

I am using a Restful API for DELETE for Product.

On delete() below stacktrace is seen.

org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'org.grails.datastore.mapping.dirty.checking.DirtyCheckingMap@19284357' with class 'org.grails.datastore.mapping.dirty.checking.DirtyCheckingMap' to class 'java.lang.Iterable' due to: groovy.lang.GroovyRuntimeException: Could not find matching constructor for: java.lang.Iterable(org.grails.datastore.mapping.dirty.checking.DirtyCheckingMap)
    at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:403) ~[groovy-2.4.5.jar:2.4.5]
    at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnNumber(DefaultTypeTransformation.java:319) ~[groovy-2.4.5.jar:2.4.5]
    at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:232) ~[groovy-2.4.5.jar:2.4.5]
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.java:603) ~[groovy-2.4.5.jar:2.4.5]
    at org.grails.datastore.mapping.mongo.engine.MongoCodecEntityPersister.deleteEntity(MongoCodecEntityPersister.groovy:483) ~[grails-datastore-gorm-mongodb-5.0.0.RC2.jar:na]
    at org.grails.datastore.mapping.engine.EntityPersister.delete(EntityPersister.java:262) ~[grails-datastore-core-5.0.0.RC2.jar:na]
    at org.grails.datastore.mapping.core.AbstractSession.delete(AbstractSession.java:727) ~[grails-datastore-core-5.0.0.RC2.jar:na]
    at org.grails.datastore.gorm.GormInstanceApi$_delete_closure9.doCall(GormInstanceApi.groovy:262) ~[grails-datastore-gorm-5.0.0.RC2.jar:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_66]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_66]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_66]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_66]
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) ~[groovy-2.4.5.jar:2.4.5]

Main class to look at is MongoCodecEntityPersister.groovy:484

if(v != null) {
    mongoSession.delete( (Iterable) v )
}

In case of a Map property v would be DirtyCheckingMap which implements Map interface which in fact is not Iterable, therefore the exception.

Fix:

A simple fix would be in MongoCodecEntityPersister as:

if(v != null) {
    mongoSession.delete( v in DirtyCheckingMap ? v : (Iterable) v )
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions