Reputation: 8587
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
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