Spring Boot测试构建失败:entityManagerFactory创建异常求助
我的Spring Boot应用正常启动时运行正常,但执行测试构建时出现错误:创建名为‘entityManagerFactory’的Bean失败,嵌套异常为java.lang.NoClassDefFoundError,无法初始化io.hypersistence.utils.hibernate.type.json.JsonBinaryType类。已引入PostgreSQL、JPA及jsonb相关依赖,实体类中也正确配置了JsonBinaryType,相关信息如下:
测试异常信息
Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class io.hypersistence.utils.hibernate.type.json.JsonBinaryType
相关依赖片段
implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("io.hypersistence:hypersistence-utils-hibernate-55:3.7.0") implementation("javax.xml.bind:jaxb-api:2.3.1")
实体类代码
import io.hypersistence.utils.hibernate.type.json.JsonBinaryType import org.hibernate.annotations.Type import org.hibernate.annotations.TypeDef import org.springframework.cloud.gateway.route.RouteDefinition import javax.persistence.Column import javax.persistence.Entity import javax.persistence.Id import javax.persistence.Table @Entity @Table(name = "route") @TypeDef(name = "jsonb", typeClass = JsonBinaryType::class) class RouteEntity( @Id @Column(name = "id", nullable = false) var id: String, @Type(type = "jsonb") @Column(columnDefinition = "jsonb", name = "event_data", nullable = false) var eventData: RouteDefinition )
Gradle配置(版本gradle-7.5.1-bin)
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("org.springframework.boot") version "2.7.7" id("io.spring.dependency-management") version "1.0.15.RELEASE" id("org.jetbrains.kotlin.plugin.jpa") version "1.7.20" kotlin("jvm") version "1.7.21" kotlin("plugin.spring") version "1.7.21" java id("idea") id("io.sentry.jvm.gradle") version "4.2.0" jacoco } version = "" java.sourceCompatibility = JavaVersion.VERSION_17 repositories { mavenCentral() } val testcontainersVersion = "1.17.6" extra["testcontainersVersion"] = "1.17.6" extra["springCloudVersion"] = "2021.0.5" dependencies { implementation("org.jetbrains.kotlin:kotlin-reflect:1.7.21") implementation("javax.annotation:javax.annotation-api") implementation("io.dropwizard.metrics:metrics-core") implementation("io.micrometer:micrometer-registry-prometheus") implementation("io.prometheus:simpleclient_pushgateway:0.15.0") implementation("org.hibernate:hibernate-core:5.4.24.Final") implementation("org.hibernate:hibernate-entitymanager:5.5.9.Final") implementation("org.javassist:javassist:3.30.2-GA") implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("org.springframework.boot:spring-boot-starter-jdbc") implementation("io.hypersistence:hypersistence-utils-hibernate-55:3.7.0") implementation("javax.xml.bind:jaxb-api:2.3.1") implementation("org.postgresql:postgresql:42.5.0") implementation("org.liquibase:liquibase-core:4.19.0") implementation("org.springframework.cloud:spring-cloud-starter-bootstrap:3.1.5") implementation( group = "io.opentracing.contrib", name = "opentracing-spring-jaeger-cloud-starter", version = "3.3.1" ) implementation("com.fasterxml.jackson.datatype:jackson-datatype-hppc") implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") implementation("com.fasterxml.jackson.module:jackson-module-jaxb-annotations") implementation("com.fasterxml.jackson.core:jackson-annotations") implementation("com.fasterxml.jackson.core:jackson-databind") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("org.springframework.boot:spring-boot-starter-actuator") implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-webflux") implementation("org.springframework.cloud:spring-cloud-starter-gateway") implementation("org.springframework.boot:spring-boot-starter-validation") implementation("org.springframework.cloud:spring-cloud-starter") implementation("org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j") implementation("org.springframework.retry:spring-retry") implementation("org.springframework.boot:spring-boot-starter-logging") implementation("net.logstash.logback:logstash-logback-encoder:4.11") implementation("org.codehaus.janino:janino:3.1.9") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("org.zalando:problem-spring-webflux:0.28.0-RC.0") implementation("com.playtika.reactivefeign:feign-reactor-spring-cloud-starter:3.2.6") implementation("org.springframework.security:spring-security-config") implementation("org.springframework.security:spring-security-web") implementation("org.springframework.boot:spring-boot-starter-oauth2-client") implementation("org.springframework.boot:spring-boot-starter-oauth2-resource-server") implementation("io.projectreactor.kotlin:reactor-kotlin-extensions") implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor") implementation("io.netty:netty-tcnative-boringssl-static") // OPEN API implementation("org.springdoc:springdoc-openapi-ui:1.6.12") implementation("org.springdoc:springdoc-openapi-webflux-ui:1.6.12") implementation("org.springdoc:springdoc-openapi-kotlin:1.6.12") developmentOnly("org.springframework.boot:spring-boot-devtools") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("javax.xml.bind:jaxb-api:2.3.1") testImplementation("io.projectreactor:reactor-test") testImplementation("org.springframework.security:spring-security-test") testImplementation("io.mockk:mockk:1.13.4") testImplementation("com.ninja-squad:springmockk:4.0.2") testImplementation("org.awaitility:awaitility-kotlin:4.2.0") testImplementation("org.testcontainers:junit-jupiter:$testcontainersVersion") testImplementation("org.testcontainers:postgresql:$testcontainersVersion") testImplementation("com.github.dasniko:testcontainers-keycloak:3.2.0") annotationProcessor("org.springframework.boot:spring-boot-configuration-processor:2.7.5") // other implementation("com.github.ben-manes.caffeine:caffeine:2.9.3") implementation("com.auth0:java-jwt:4.2.1") implementation("io.micrometer:micrometer-registry-prometheus") implementation("net.bytebuddy:byte-buddy:1.12.18") implementation("io.netty:netty-bom:4.1.85.Final") // macos m1 dns resolver implementation("io.netty:netty-resolver-dns-native-macos:4.1.87.Final:osx-aarch_64") // grpc implementation("io.projectreactor:reactor-core:3.4.24") implementation("io.sentry:sentry-spring-boot-starter:7.3.0") // mocking web testImplementation("com.squareup.okhttp3:mockwebserver:4.10.0") } dependencyManagement { imports { mavenBom("org.springframework.cloud:spring-cloud-dependencies:${property("springCloudVersion")}") } } tasks.withType<KotlinCompile> { kotlinOptions { freeCompilerArgs = listOf("-Xjsr305=strict") jvmTarget = "17" } }
1. 核心问题:Hibernate版本冲突
你的Gradle配置中手动指定了hibernate-core:5.4.24.Final和hibernate-entitymanager:5.5.9.Final,但引入的hypersistence-utils-hibernate-55:3.7.0是适配Hibernate 5.5.x的工具类。同时Spring Boot 2.7.7默认依赖Hibernate 5.6.x,手动指定的低版本Hibernate与工具类不兼容,导致JsonBinaryType初始化失败。
另外,hibernate-entitymanager在Hibernate 5.4之后已合并到hibernate-core,无需单独引入,这会加剧版本混乱。
2. 修复步骤
移除手动指定的Hibernate依赖:删除以下两行配置,让Spring Boot依赖管理自动引入适配版本(2.7.7对应5.6.14.Final):
implementation("org.hibernate:hibernate-core:5.4.24.Final") implementation("org.hibernate:hibernate-entitymanager:5.5.9.Final")匹配Hypersistence Utils版本:Spring Boot 2.7.x用Hibernate 5.6.x,需升级工具类到适配版本:
implementation("io.hypersistence:hypersistence-utils-hibernate-56:3.7.0")或使用Spring Boot starter自动适配:
implementation("io.hypersistence:hypersistence-utils-spring-boot:3.7.0")确认测试环境依赖:
hypersistence-utils是implementation范围,默认会传递到测试环境,若有特殊依赖排除规则,需确保测试类路径能获取到该依赖。
3. 额外优化
- 清理重复依赖:配置中
com.fasterxml.jackson.module:jackson-module-kotlin出现两次,删除冗余项。 - 避免手动指定无需自定义的依赖:如
jaxb-api、javassist等,Spring Boot starter已包含适配版本,手动指定易引发冲突。
内容的提问来源于stack exchange,提问作者Padawan

