【问题标题】:Error on run-app with grails 3.3.4使用 grails 3.3.4 运行应用程序时出错
【发布时间】:2018-09-23 16:07:53
【问题描述】:

我正在尝试将我的应用程序从 grails 3.2.11 升级到 3.3.4 在做 grails run-app 时,我遇到了错误:

引起:org.springframework.beans.BeanInstantiationException: 无法实例化 [org.grails.orm.hibernate.HibernateDatastore]: 构造函数抛出异常;嵌套异常是 java.lang.NullPointerException 在 org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:154) 在 org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:122) 在 org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:271) ...省略了 49 个常见帧 原因:java.lang.NullPointerException:null 在 org.grails.orm.hibernate.cfg.GrailsDomainBinder.getTableName(GrailsDomainBinder.java:1202) 在 org.grails.orm.hibernate.cfg.GrailsDomainBinder.calculateTableForMany(GrailsDomainBinder.java:1155) 在 org.grails.orm.hibernate.cfg.GrailsDomainBinder.bindCollectionTable(GrailsDomainBinder.java:1105) 在 org.grails.orm.hibernate.cfg.GrailsDomainBinder.bindCollection(GrailsDomainBinder.java:1052) 在 org.grails.orm.hibernate.cfg.GrailsDomainBinder$CollectionType$1.create(GrailsDomainBinder.java:3463) 在 org.grails.orm.hibernate.cfg.GrailsDomainBinder.createClassProperties(GrailsDomainBinder.java:1872) 在 org.grails.orm.hibernate.cfg.GrailsDomainBinder.bindRootPersistentClassCommonValues(GrailsDomainBinder.java:1751) 在 org.grails.orm.hibernate.cfg.GrailsDomainBinder.bindRoot(GrailsDomainBinder.java:1391) 在 org.grails.orm.hibernate.cfg.GrailsDomainBinder.contribute(GrailsDomainBinder.java:165) 在 org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:275) 在 org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83) 在 org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418) 在 org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:692) 在 org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration.buildSessionFactory(HibernateMappingContextConfiguration.java:276) 在 org.grails.orm.hibernate.connections.HibernateConnectionSourceFactory.create(HibernateConnectionSourceFactory.java:86) 在 org.grails.orm.hibernate.connections.AbstractHibernateConnectionSourceFactory.create(AbstractHibernateConnectionSourceFactory.java:39) 在 org.grails.orm.hibernate.connections.AbstractHibernateConnectionSourceFactory.create(AbstractHibernateConnectionSourceFactory.java:23) 在 org.grails.datastore.mapping.core.connections.AbstractConnectionSourceFactory.create(AbstractConnectionSourceFactory.java:64) 在 org.grails.datastore.mapping.core.connections.AbstractConnectionSourceFactory.create(AbstractConnectionSourceFactory.java:52) 在 org.grails.datastore.mapping.core.connections.ConnectionSourcesInitializer.create(ConnectionSourcesInitializer.groovy:24) 在 org.grails.orm.hibernate.HibernateDatastore.(HibernateDatastore.java:204) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 org.springsource.loaded.ri.ReflectiveInterceptor.jlrConstructorNewInstance(ReflectiveInterceptor.java:1076) 在 org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142) ...省略了51个常用框架

有人有同样的想法吗?

【问题讨论】:

标签: hibernate grails grails-3.3


【解决方案1】:

我调查了这个问题,不幸的是,这是对 mapWith 静态属性的不当使用。问题实际上不在于 mapWith 属性,而是您在非持久类上有 hasMany,因为它不受支持。

虽然这可能以前有效(验证您描述的行为在 3.2.13 和 Gorm 6.0.x 中都有效)它不是一个功能,但在 Grails 3.3.x 和 Gorm 6.1.x 中这不起作用,例如hasMany 不适用于非持久化类。

删除mapWith 似乎允许它像以前的版本一样工作,并且似乎不会导致问题(您的里程可能会有所不同)。您还可以删除关系,这也将使您摆脱错误。但同样,关系是为持久对象设计的,因此最好考虑进行一些域更新。

【讨论】:

    【解决方案2】:

    我能够找到这种行为的原因,但仍然不知道使用 grails 3.3.4 的解决方案

    这是由于域类的“静态 mapWith”属性,例如 AbcType。

    class AbcType extends Abc {
    
    static mapWith = "none"
    
      static mapping = {
        discriminator value: 1
      }
    
    }
    

    我不希望它保存在数据库中。因此,我使用了 mapWith 属性。

    如果我评论此域类的“静态 mapWith”属性。然后,一切都可以无缝运行,没有任何错误。

    我查看了 3.3.4 文档,“静态 mapWith”属性仍然受支持。

    有没有人对此行为有任何想法。我有什么遗漏吗?

    【讨论】:

    • 您需要发布更多信息来解释您的具体情况。如上所述,如果您在AbcType 上建立了任何类型的关系,这将不起作用(即,如果您有 hasMany,belongsTo=[AbcType] 这将失败,因为您不能与非持久实体建立关系)。同样如前所述 3.3.x 如果您删除 mapWith 它似乎与以前的版本一样,并且如果您查看您的数据库实际上并没有持久化表。
    • 我将重新设计域及其关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    相关资源
    最近更新 更多