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

使用WebTestClient编写集成测试时遇HV000183初始化异常求助

解决WebTestClient测试中出现的javax.validation.ValidationException: HV000183异常

这个问题我之前做Spring Boot控制器切片测试的时候也踩过坑!咱们来拆解一下原因和解决办法:

问题根源

你用WebTestClient做仅启动控制器的集成测试(比如用@WebMvcTest注解)时,Hibernate Validator(Spring默认的Bean校验框架)初始化需要依赖EL表达式工厂(javax.el.ExpressionFactory)来支持校验逻辑(比如消息插值、复杂校验规则的表达式解析)。但切片测试的依赖环境里,默认没引入EL相关的实现类,就导致了这个初始化异常。

另外从Spring Boot 2.3版本开始,spring-boot-starter-validation不再包含在spring-boot-starter-web里了,如果你的项目没手动引入这个starter,也会触发这个问题。

解决方案

根据你的测试需求,选下面其中一种方案就行:

方案1:引入完整的校验starter(推荐)

如果你的控制器用到了@Valid、@NotEmpty这类校验注解,直接引入Spring Boot的校验starter,它会自动帮你配齐所有校验相关的依赖(包括EL实现):

Maven依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    <scope>test</scope>
</dependency>

Gradle依赖:

testImplementation 'org.springframework.boot:spring-boot-starter-validation'

方案2:仅引入EL表达式依赖

如果不想引入整个校验starter,只需要单独添加EL实现的依赖(比如Glassfish的EL实现):

Maven依赖:

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.el</artifactId>
    <version>3.0.1-b11</version>
    <scope>test</scope>
</dependency>

方案3:禁用校验自动配置(仅当不需要校验时)

如果你的测试完全不需要校验功能,可以在测试类里排除校验的自动配置类,跳过Validator的初始化:

@WebMvcTest(
    controllers = YourTargetController.class,
    excludeAutoConfiguration = ValidationAutoConfiguration.class
)
public class YourControllerTest {
    // 测试代码
}

额外提示

检查一下你的测试类注解,如果是用@SpringBootTest配合WebTestClient,其实会加载完整的Spring上下文,一般不会出现这个问题;但切片测试(@WebMvcTest)因为只加载最小化的上下文,才会遇到依赖缺失的情况。

内容的提问来源于stack exchange,提问作者nateha1984

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:07:54