无法继承hasMany属性

时间:2019-03-22 05:50:27

标签: inheritance grails gorm has-many

我当前正在将grails代码从2.5.6版本迁移到3.3.9。在3.3.9上,我观察到了这种奇怪的行为:

有一个抽象类(在src / main / groovy中),其中包含hasMany关系。

package srcFolder

import grailsthree.TestSimpleClass

abstract class TestSuperClass {
    String superClassValue

    static hasMany = [simples: TestSimpleClass]
}

继承此抽象类的域类。

package grailsthree

import srcFolder.TestSuperClass

class TestSubClass extends TestSuperClass{
    String subClassValue

    static constraints = {
    }
}

在Bootstrap中,调用子类的hasMany属性的addTo

package grailsthree

class BootStrap {

    def init = { servletContext ->
        TestSimpleClass testSimpleClass = new TestSimpleClass(simpleClassValue: 'simpleClassValue').save()
        TestSubClass testSubClass = new TestSubClass(subClassValue: 'subClassValue')
        testSubClass.addToSimples(testSimpleClass)
        testSubClass.save()
    }
    def destroy = {
    }
}

出现以下错误:

groovy.lang.MissingMethodException: No signature of method: grailsthree.TestSubClass.addToSimples() is applicable for argument types: (grailsthree.TestSimpleClass) values: [grailsthree.TestSimpleClass : 1]
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:71)
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:53)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:128)
    at grailsthree.BootStrap$_closure1.doCall(BootStrap.groovy:8)
    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:498)
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1427)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:264)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1099)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034)
    at groovy.lang.Closure.call(Closure.java:418)
    at groovy.lang.Closure.call(Closure.java:412)
    at grails.util.Environment.evaluateEnvironmentSpecificBlock(Environment.java:541)
    at grails.util.Environment.executeForEnvironment(Environment.java:534)
    at grails.util.Environment.executeForCurrentEnvironment(Environment.java:510)
    at org.grails.web.servlet.boostrap.DefaultGrailsBootstrapClass.callInit(DefaultGrailsBootstrapClass.java:74)
    at org.grails.web.servlet.context.GrailsConfigUtils.executeGrailsBootstraps(GrailsConfigUtils.java:65)
    at org.grails.plugins.web.servlet.context.BootStrapClassRunner.onStartup(BootStrapClassRunner.groovy:53)
    at grails.boot.config.GrailsApplicationPostProcessor.onApplicationEvent(GrailsApplicationPostProcessor.groovy:263)
    at grails.boot.config.GrailsApplicationPostProcessor.onApplicationEvent(GrailsApplicationPostProcessor.groovy)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:393)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:347)
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:883)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:146)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:546)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:124)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
    at grails.boot.GrailsApp.run(GrailsApp.groovy:84)
    at grails.boot.GrailsApp.run(GrailsApp.groovy:393)
    at grails.boot.GrailsApp.run(GrailsApp.groovy:380)
    at grails.boot.GrailsApp$run.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:136)
    at grailsthree.Application.main(Application.groovy:8)

就像在Grails 3.3.9上一样,子类没有继承抽象类hasMany属性。这对于Grails 2.5.6来说很好用。

在这种情况下,我们需要在Grails 3.3.9中进行其他处理吗?

0 个答案:

没有答案