找不到解决方案?

在 Ebean 论坛发帖提问:Ebean google 组或:Ebean github 讨论

java.lang.IllegalStateException: Bean 类 _ 未增强?

操作

1. 检查是否已安装 IDEAEclipse 的 IDE 增强插件
2. 检查是否正在使用 mavengradle 的增强插件

有关增强的更多详细信息,请参阅 文档/开始使用

使用查询 Bean 时出现 NullPointerException

示例

new QCustomer
  .name.istartsWith("rob")  //   <-- Getting NPE here
  .findList()

诊断

对于 Java:查询 Bean 或使用查询 Bean 的代码未增强。

对于 Kotlin:查询 Bean 未增强。

操作

1. 检查 ebean.mf 中的 querybean-packages 条目

对于 Java:我们需要增强使用查询 Bean 的代码和查询 Bean 本身。querybean-packages 指定的包需要包括使用查询 Bean 的代码。

对于 Kotlin:对于 Kotlin,我们只需要增强查询 Bean 本身(而不是调用代码)。对于 Kotlin,querybean-packages 只需包含查询 Bean。

请注意,从 12.1.8 开始,我们不再需要 ebean.mf 来支持查询 Bean 增强。

EntityBeanIntercept 中的 NullPointerException

示例

Caused by: java.lang.NullPointerException: null
at io.ebean.bean.EntityBeanIntercept.isLoadedProperty(EntityBeanIntercept.java:509)
at io.ebean.bean.EntityBeanIntercept.preGetter(EntityBeanIntercept.java:914)
at models.Security._ebean_get_status(Security.java:6)

诊断

对于 Java:可能存在有问题的 @OnetoMany@ManyToOne 映射。

对于 Kotlin:可能存在有问题的 @OnetoMany@ManyToOne 映射。

操作

1. 检查抛出异常的模型类中的映射。
在上面的示例中,它是 models.Security 类。逐个注释掉每个映射,直到异常消失,然后你就可以确定问题所在。

 

RuntimeException:是否注册了 org.example.domain.Foo 类?

诊断

Ebean 不认为有问题的 bean 是实体 bean,或者我们正在显式注册实体 bean(通过 ServerConfig.addClass()),并且没有将实体 bean 添加到其中。

操作

1. 检查 bean 是否有 @Entity 注解
2. 必要时注册实体 bean

如果实体 bean 通过 serverConfig.addClass() 显式注册,则可能需要包含此实体 bean 类。

通常的堆栈跟踪
Caused by: java.lang.RuntimeException: Error with association to [class org.example.domain.Contact]
 from [org.example.domain.Customer.contacts]. Is class org.example.domain.Contact registered?
 at io.ebeaninternal.server.deploy.parse.AnnotationAssocManys.readToOne(AnnotationAssocManys.java:476)
 at io.ebeaninternal.server.deploy.parse.AnnotationAssocManys.read(AnnotationAssocManys.java:73)
 at io.ebeaninternal.server.deploy.parse.AnnotationAssocManys.parse(AnnotationAssocManys.java:64)
 at io.ebeaninternal.server.deploy.parse.ReadAnnotations.readAssociations(ReadAnnotations.java:50)
 ... 37 more

 

数据源用户为空?

操作

1. 检查是否有 application-test.yml(或等效文件)来指定数据源
2. 检查 io.ebean : ebean-test 是否是测试依赖项

请参阅 docs / testing 以设置 ebean-test

通常的堆栈跟踪
ERROR io.ebean.Ebean - Error trying to create the default EbeanServer
 java.lang.RuntimeException: DataSource user is null?
 at org.avaje.datasource.pool.ConnectionPool.&lt;init&gt;(ConnectionPool.java:207)
 at org.avaje.datasource.core.Factory.createPool(Factory.java:15)
 at io.ebeaninternal.server.core.DefaultContainer.getDataSourceFromConfig(DefaultContainer.java:273)
 at io.ebeaninternal.server.core.DefaultContainer.setDataSource(DefaultContainer.java:217)
 ...

瞬态初始化

操作

1. 显式向具有错误的实体 bean 添加一个默认构造函数。此构造函数将初始化所有字段,包括瞬态字段,ebean 将使用此构造函数而不是添加默认构造函数。
2. 或(不推荐)添加 src/resources/ebean.mf,其中包含 transient-init-error: false 以关闭此错误。不建议这样做,但如果需要,可以使用它来支持旧行为。在这种情况下,当 ebean 创建实例时,瞬态字段将保持未初始化状态。

诊断

这是由 ebean-agent 在增强没有默认构造函数的实体 bean 时抛出的错误,并且构造函数中的代码包含以 ebean-agent 无法支持的方式初始化瞬态(非持久)字段的代码。

如果在构造函数中初始化瞬态字段,则必须使用一个简单的 <init>,该 <init> 使用类型的无参数默认构造函数。不支持通过任何其他方式进行初始化(不支持使用方法或非默认构造函数)。

当遇到此限制时,我们可以选择自己添加一个默认构造函数。通过这种方式,我们可以获得完全控制,并且 ebean-agent 无需添加默认构造函数。

请注意,“不支持”实际上意味着 ebean-agent 无法在它正在添加的默认构造函数中初始化那些瞬态字段。当 ebean 使用此默认构造函数创建实例时,这些字段将保持未初始化状态,因此为 null、0、false 等 [当我们使用 transient-init-error: false 时]。

通常的堆栈跟踪
ebean-enhance> cls: test/model/BeanWithInvalidTransientInit  msg: Error during transform java.lang.RuntimeException:
  ERROR: Entity class without default constructor has unsupported initialisation of transient fields.
  Entity class: test/model/BeanWithInvalidTransientInit - Unsupported initialisation of transient fields - [invalidTransientInitWithoutDefaultConstructor, invalidTransientInitViaMethod]
  Refer: https://ebean.com.cn/docs/trouble-shooting#transient-initialisation
java.lang.RuntimeException: ERROR: Entity class without default constructor has unsupported initialisation of transient fields. Entity class: test/model/BeanWithInvalidTransientInit - Unsupported initialisation of transient fields - [invalidTransientInitWithoutDefaultConstructor, invalidTransientInitViaMethod] Refer: https://ebean.com.cn/docs/trouble-shooting#transient-initialisation
        at io.ebean.enhance.entity.DefaultConstructor.add(DefaultConstructor.java:26)
        at io.ebean.enhance.entity.ClassAdapterEntity.visitEnd(ClassAdapterEntity.java:214)
        at io.ebean.enhance.asm.ClassReader.accept(ClassReader.java:748)
        at io.ebean.enhance.asm.ClassReader.accept(ClassReader.java:424)
        at io.ebean.enhance.Transformer.entityEnhancement(Transformer.java:266)
        at io.ebean.enhance.Transformer.enhanceEntityAndTransactional(Transformer.java:223)
        at io.ebean.enhance.Transformer.transform(Transformer.java:178)
        at io.ebean.enhance.common.InputStreamTransform.transform(InputStreamTransform.java:53)
        at io.ebean.enhance.common.InputStreamTransform.transform(InputStreamTransform.java:41)
        at io.ebean.enhance.ant.OfflineFileTransform.transformFile(OfflineFileTransform.java:148)
        at io.ebean.enhance.ant.OfflineFileTransform.processPackage(OfflineFileTransform.java:132)
        at io.ebean.enhance.ant.OfflineFileTransform.processPackage(OfflineFileTransform.java:124)
        at io.ebean.enhance.ant.OfflineFileTransform.processPackage(OfflineFileTransform.java:124)
        at io.ebean.enhance.ant.OfflineFileTransform.process(OfflineFileTransform.java:66)
        at io.ebean.enhance.maven.AbstractEnhance.executeFor(AbstractEnhance.java:77)
        at io.ebean.enhance.maven.TestEnhanceMojo.execute(TestEnhanceMojo.java:27)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)

请注意,Ebean 版本 13.12.0 默认启用了此错误。