V H
V H

Reputation: 8587

grails 3.1.10 custom validator issue without this. defined

Nothing special about situation and am sure it has only recently started happening tried a grails clean which hasn't got rid of the issue:

a domain class:

  static constraints = {
     someThing(nullable:true, validator: this.checkSomething)
    }
    static def checkSomething= { val, obj, errors ->
        if (val && obj.something?.findAll()?.size()>2 {
            errors.rejectValue("something.error", [''] as Object[], '')
        }
    }

Without the this. below error. With this.staticMethod ide complains that it is not required. It is right I shouldn't need it. Just wondering why the strange scenario

error caused:

Caused by: groovy.lang.MissingPropertyException: No such property: checkSomething for class: org.grails.orm.hibernate.cfg.HibernateMappingBuilder
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:53)
    at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:52)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:307)
    at com.example$__clinit__closure1.doCall(MyClass.groovy:27)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1426)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1021)
    at groovy.lang.Closure.call(Closure.java:426)
    at com.example$__clinit__closure1.call(MyClass.groovy)
    at groovy.lang.Closure.call(Closure.java:442)
    at com.example$__clinit__closure1.call(MyClass.groovy)
    at org.grails.orm.hibernate.cfg.HibernateMappingBuilder.evaluate(HibernateMappingBuilder.groovy:81)
    at org.grails.orm.hibernate.cfg.HibernateMappingBuilder.evaluate(HibernateMappingBuilder.groovy)
    at org.grails.datastore.mapping.config.AbstractGormMappingFactory.evaluateWithContext(AbstractGormMappingFactory.java:96)
    at org.grails.datastore.mapping.config.AbstractGormMappingFactory.createMappedForm(AbstractGormMappingFactory.java:84)
    at org.grails.orm.hibernate.cfg.HibernatePersistentEntity$1.<init>(HibernatePersistentEntity.java:41)
    at org.grails.orm.hibernate.cfg.HibernatePersistentEntity.<init>(HibernatePersistentEntity.java:40)
    at org.grails.orm.hibernate.cfg.HibernateMappingContext.createPersistentEntity(HibernateMappingContext.java:104)
    at org.grails.datastore.mapping.model.AbstractMappingContext.addPersistentEntities(AbstractMappingContext.java:184)
    at org.grails.orm.hibernate.cfg.HibernateMappingContext.<init>(HibernateMappingContext.java:55)
    at org.grails.orm.hibernate.support.HibernateMappingContextFactoryBean.getObject(HibernateMappingContextFactoryBean.groovy:34)
    at org.grails.orm.hibernate.support.HibernateMappingContextFactoryBean.getObject(HibernateMappingContextFactoryBean.groovy)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:168)
    ... 63 common frames omitted

Upvotes: 1

Views: 122

Answers (1)

Scott Ingram
Scott Ingram

Reputation: 85

The solution I found involves explicitly specifying the name of the class with the static method. I'm guessing the problem comes from the Groovy interceptor magic that Grails employs to support the static constraints = { thingsThatLookLikeParamsButAreReallyMethodCalls } syntax.

class MyClassFoo {

  static constraints = {
     someThing(nullable:true, validator: MyClassFoo.checkSomething)
  }

  static checkSomething= { val, obj, errors ->
     // your logic
  }
}

Upvotes: 1

Related Questions