You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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。直接替换注解:
    @JdbcTypeCode(SqlTypes.JSON)
    @Column(columnDefinition = "json")
    private List<String> days = new ArrayList<>();
    
    该方式无额外依赖,更适配当前Hibernate版本的初始化流程。
  • 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:30:50