使用Hibernate自定义类型时WildFly 27.0.1启动失败报NotYetReadyException
问题描述
我们刚把应用从Java EE 8(WildFly 20)迁移到Jakarta EE 10(WildFly 27),大部分功能正常,但使用hibernate-types做JSON映射时服务器启动失败,抛出NotYetReadyException提示CDI BeanManager未就绪。测试发现只要实体类中保留@Type(JsonType.class)就会触发问题,移除后服务器能正常启动。
相关代码片段:
@Type(JsonType.class) @Column(columnDefinition = "json") private List<String> days = new ArrayList<>();
异常栈信息:
10:24:02,067 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 93) MSC000001: Failed to start service jboss.persistenceunit."Test-WebApp-1.0-SNAPSHOT.war#xxx.PU": org.jboss.msc.service.StartException in service jboss.persistenceunit."Test-WebApp-1.0-SNAPSHOT.war#xxx.PU": org.hibernate.resource.beans.container.internal.NotYetReadyException: CDI BeanManager not (yet) ready to use at org.jboss.as.jpa@27.0.1.Final//org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:199) at org.jboss.as.jpa@27.0.1.Final//org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:129) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at org.wildfly.security.elytron-base@2.0.0.Final//org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:664) at org.jboss.as.jpa@27.0.1.Final//org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:214) at org.jboss.threads@2.4.0.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990) at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486) at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377) at java.base/java.lang.Thread.run(Thread.java:833) at org.jboss.threads@2.4.0.Final//org.jboss.threads.JBossThread.run(JBossThread.java:513) Caused by: org.hibernate.resource.beans.container.internal.NotYetReadyException: CDI BeanManager not (yet) ready to use at org.hibernate@6.1.5.Final//org.hibernate.resource.beans.container.internal.JpaCompliantLifecycleStrategy$NamedBeanImpl.initialize(JpaCompliantLifecycleStrategy.java:231) at org.hibernate@6.1.5.Final//org.hibernate.resource.beans.container.internal.CdiBeanContainerExtendedAccessImpl$NamedBeanImpl.initialize(CdiBeanContainerExtendedAccessImpl.java:165) at org.hibernate@6.1.5.Final//org.hibernate.resource.beans.container.internal.CdiBeanContainerExtendedAccessImpl$NamedBeanImpl.getBeanInstance(CdiBeanContainerExtendedAccessImpl.java:172) at org.hibernate@6.1.5.Final//org.hibernate.resource.beans.internal.ManagedBeanRegistryImpl$ContainedBeanManagedBeanAdapter.getBeanInstance(ManagedBeanRegistryImpl.java:155) at org.hibernate@6.1.5.Final//org.hibernate.mapping.BasicValue.setExplicitCustomType(BasicValue.java:828) at org.hibernate@6.1.5.Final//org.hibernate.cfg.annotations.BasicValueBinder.fillSimpleValue(BasicValueBinder.java:1238) at org.hibernate@6.1.5.Final//org.hibernate.cfg.SetBasicValueTypeSecondPass.doSecondPass(SetBasicValueTypeSecondPass.java:26) at org.hibernate@6.1.5.Final//org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1782) at org.hibernate@6.1.5.Final//org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1729) at org.hibernate@6.1.5.Final//org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:300) at org.hibernate@6.1.5.Final//org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1350) at org.hibernate@6.1.5.Final//org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1421) at org.hibernate.jipijapa-hibernate6@27.0.1.Final//org.jboss.as.jpa.hibernate.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:45) at org.jboss.as.jpa@27.0.1.Final//org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:171) ... 10 more Caused by: java.lang.NullPointerException: Cannot invoke "jakarta.enterprise.inject.spi.BeanManager.createCreationalContext(jakarta.enterprise.context.spi.Contextual)" because "this.beanManager" is null at org.hibernate@6.1.5.Final//org.hibernate.resource.beans.container.internal.JpaCompliantLifecycleStrategy$NamedBeanImpl.initialize(JpaCompliantLifecycleStrategy.java:228) ... 23 more
解决提示
- 升级hibernate-types版本:使用适配Jakarta EE 10和Hibernate 6.x的
hibernate-types-60系列版本(groupId为com.vladmihalcea,版本至少6.0以上),旧版本在CDI初始化时序上与WildFly 27不兼容。 - 改用Hibernate原生JSON映射:Hibernate 6.x已原生支持JSON类型,无需依赖hibernate-types。直接替换注解:
该方式无额外依赖,更适配当前Hibernate版本的初始化流程。@JdbcTypeCode(SqlTypes.JSON) @Column(columnDefinition = "json") private List<String> days = new ArrayList<>(); - 调整PersistenceUnit启动时序:在
persistence.xml中添加<property name="hibernate.cdi.extension.preferred" value="false"/>,强制Hibernate使用JPA兼容的生命周期策略,避免提前依赖未就绪的CDI BeanManager。 - 检查WildFly模块配置:若服务器自带Hibernate模块与应用依赖冲突,可通过
jboss-deployment-structure.xml排除服务器模块,改用应用打包的Hibernate版本。
内容的提问来源于stack exchange,提问作者jheider
相关产品推荐
相关产品推荐

