使用 grails 3.3.4 的 运行-app 出错

Error on run-app with grails 3.3.4

我正在尝试将我的应用程序从 grails 3.2.11 升级到 3.3.4 在做 grails 运行-app 时,我得到以下错误:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.grails.orm.hibernate.HibernateDatastore]: Constructor threw exception; nested exception is java.lang.NullPointerException at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:154) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:122) at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:271) ... 49 common frames omitted Caused by: java.lang.NullPointerException: null at org.grails.orm.hibernate.cfg.GrailsDomainBinder.getTableName(GrailsDomainBinder.java:1202) at org.grails.orm.hibernate.cfg.GrailsDomainBinder.calculateTableForMany(GrailsDomainBinder.java:1155) at org.grails.orm.hibernate.cfg.GrailsDomainBinder.bindCollectionTable(GrailsDomainBinder.java:1105) at org.grails.orm.hibernate.cfg.GrailsDomainBinder.bindCollection(GrailsDomainBinder.java:1052) at org.grails.orm.hibernate.cfg.GrailsDomainBinder$CollectionType.create(GrailsDomainBinder.java:3463) at org.grails.orm.hibernate.cfg.GrailsDomainBinder.createClassProperties(GrailsDomainBinder.java:1872) at org.grails.orm.hibernate.cfg.GrailsDomainBinder.bindRootPersistentClassCommonValues(GrailsDomainBinder.java:1751) at org.grails.orm.hibernate.cfg.GrailsDomainBinder.bindRoot(GrailsDomainBinder.java:1391) at org.grails.orm.hibernate.cfg.GrailsDomainBinder.contribute(GrailsDomainBinder.java:165) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:275) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83) at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418) at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:692) at org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration.buildSessionFactory(HibernateMappingContextConfiguration.java:276) at org.grails.orm.hibernate.connections.HibernateConnectionSourceFactory.create(HibernateConnectionSourceFactory.java:86) at org.grails.orm.hibernate.connections.AbstractHibernateConnectionSourceFactory.create(AbstractHibernateConnectionSourceFactory.java:39) at org.grails.orm.hibernate.connections.AbstractHibernateConnectionSourceFactory.create(AbstractHibernateConnectionSourceFactory.java:23) at org.grails.datastore.mapping.core.connections.AbstractConnectionSourceFactory.create(AbstractConnectionSourceFactory.java:64) at org.grails.datastore.mapping.core.connections.AbstractConnectionSourceFactory.create(AbstractConnectionSourceFactory.java:52) at org.grails.datastore.mapping.core.connections.ConnectionSourcesInitializer.create(ConnectionSourcesInitializer.groovy:24) at org.grails.orm.hibernate.HibernateDatastore.(HibernateDatastore.java:204) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.springsource.loaded.ri.ReflectiveInterceptor.jlrConstructorNewInstance(ReflectiveInterceptor.java:1076) at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142) ... 51 common frames omitted

有没有人对此有任何想法?

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

这是由于域 class 的 "static mapWith" 属性,例如 AbcType。

class AbcType extends Abc {

static mapWith = "none"

  static mapping = {
    discriminator value: 1
  }

}

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

如果我评论 "static mapWith" 属性 这个域 Class。然后,一切都无缝运行,没有任何错误。

我查看了 3.3.4 文档,"static mapWith" 属性 仍然受支持。

有没有人知道这种行为。有什么我遗漏的吗?

我调查了这个问题,不幸的是,这是对 mapWith 静态 属性 的不当使用。问题不是真正的 mapWith 属性,而是你在未持久化的 class 上有一个 hasMany,因为它不受支持。

虽然这以前可能有效(已验证您描述的行为在 3.2.13 与 Gorm 6 一起有效。0.x)它不是一个功能,但在 Grails 3 中不起作用。3.x 与 Gorm 6.1.x 因为诸如 hasMany 的关系不适用于未持久化的 classes.

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

对于 运行 grails clean 并且一切开始正常工作