Skip to content

[3.1.2] - validate() method on Domain class causes getXyz() methods without parameters to be called #9749

@droggo

Description

@droggo

After upgrade to 3.1.2 it seems that all getters in domains classes are considered constrained properties and are called during validatation. Even if method is marked transient or 'property' is added to transients list.

This is a big issue for us, application will not start, a lot of tests are failing, and this will also strongly influence performance. Please let us know if we should start refactoring to change method names or this is not planned and is a bug.

Application startup issue. Using spring-security plugin, we use RoleGroup class which has a getter for authorities - getRoles() (executing database query). When RoleGroup is saved, following error is thrown:

org.springframework.beans.InvalidPropertyException: Invalid property 'roles' of bean class [some.package.RoleGroup]: Getter for property 'roles' threw exception; nested exception is java.lang.reflect.InvocationTargetException
        at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:704) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:610) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.grails.validation.GrailsDomainClassValidator.validatePropertyWithConstraint(GrailsDomainClassValidator.java:211) ~[grails-validation-3.1.2.jar:3.1.2]
        at org.grails.validation.GrailsDomainClassValidator.validate(GrailsDomainClassValidator.java:81) ~[grails-validation-3.1.2.jar:3.1.2]
        at org.grails.orm.hibernate.AbstractHibernateGormInstanceApi.save(AbstractHibernateGormInstanceApi.groovy:122) ~[grails-datastore-gorm-hibernate-core-5.0.2.RELEASE.jar:na]
        at org.grails.datastore.gorm.GormEntity$Trait$Helper.save(GormEntity.groovy:140) ~[grails-datastore-gorm-5.0.2.RELEASE.jar:na]
        at org.grails.datastore.gorm.GormEntity$Trait$Helper$save$1.call(Unknown Source) ~[na:na]
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) [groovy-2.4.6.jar:2.4.6]
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) [groovy-2.4.6.jar:2.4.6]
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133) [groovy-2.4.6.jar:2.4.6]
        at some.package.RoleGroup.save(RoleGroup.groovy) 
        at some.package.RoleGroup.save(RoleGroup.groovy) 
        at org.grails.datastore.gorm.GormEntity$save.call(Unknown Source) ~[na:na]
        at org.codehaus.groovy.runtime.callsiteteArray.defaultCall(CallSiteArray.java:48) [groovy-2.4.6.jar:2.4.6]
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) [groovy-2.4.6.jar:2.4.6]
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) [groovy-2.4.6.jar:2.4.6]
        at some.package.UserService.createRoleGroup(UserService.groovy:75) 

Performance impact example:

class SomeDomain {
    transient Collection getImages(){
        AnotherDomain.findAllBySomeDomain(this)
    }
}

Since 3.1.2 of every validation of SomeDomain, query will be done to fetch all AnotherDomain objects.

If getter throws exception, which happens for some of our getter methods following error is logged: :

org.springframework.beans.InvalidPropertyException: Invalid property 'someProperty' of bean class [SomeDomain]: Getter for property 'someProperty' threw exception; nested exception is java.lang.reflect.InvocationTargetException
    at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:704)
    at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:610)
    at org.grails.validation.GrailsDomainClassValidator.validatePropertyWithConstraint(GrailsDomainClassValidator.java:211)
    at org.grails.validation.GrailsDomainClassValidator.validate(GrailsDomainClassValidator.java:81)
    at org.grails.datastore.gorm.GormValidationApi.doValidate(GormValidationApi.groovy:89)
    at org.grails.datastore.gorm.GormValidationApi.validate(GormValidationApi.groovy:161)
    at org.grails.datastore.gorm.GormValidateable$Trait$Helper.validate(GormValidateable.groovy:87)
    at org.grails.datastore.gorm.GormInstanceApi.doSave(GormInstanceApi.groovy:181)
    at org.grails.datastore.gorm.GormInstanceApi.save_closure5(GormInstanceApi.groovy:170)
    at groovy.lang.Closure.call(Closure.java:426)
    at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:310)
    at org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:37)
    at org.grails.datastore.gorm.GormInstanceApi.save(GormInstanceApi.groovy:169)
    at org.grails.datastore.gorm.GormInstanceApi.save(GormInstanceApi.groovy:109)
    at org.grails.datastore.gorm.GormEntity$Trait$Helper.save(GormEntity.groovy:87)

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions