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

Spring Boot测试构建失败:entityManagerFactory创建异常求助

问题:Spring Boot测试构建失败,无法初始化JsonBinaryType类

我的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:37:02