Spring MVC测试时hibernate-validator未生效无法校验无效数据如何解决
问题核心原因
你的校验逻辑未生效主要有两点:
- 使用
MockMvcBuilders.standaloneSetup()构建测试环境时,默认不会自动注册JSR-380(Bean Validation 2.0)校验器,需要手动配置 - Hibernate Validator 6.x依赖EL表达式实现,你的依赖中缺少该组件,导致校验器初始化失败
解决方案
步骤1:补充缺失的依赖
在pom.xml中添加EL表达式依赖:
<dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <version>3.0.1-b12</version> <scope>test</scope> <!-- 正式运行环境如果使用Tomcat等自带EL的容器,可去掉scope配置 --> </dependency>
步骤2:修改测试代码,手动配置校验器
在测试类中给MockMvc指定校验器即可让测试场景的校验生效:
import org.junit.Test; import org.springframework.test.web.servlet.MockMvc; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*; public class SpitterControllerTest { // 初始化JSR-380标准校验器 private final LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); @Test public void shouldNotProcessEmptyRegistration() throws Exception { standaloneSetup(new SpitterController()) // 手动注入校验器 .setValidator(validator) .build() .perform(post("/spitter/register")) .andExpect(view().name("registerForm")); } @Test public void shouldNotProcessInvalidRegistration() throws Exception { standaloneSetup(new SpitterController()) .setValidator(validator) .build() .perform(post("/spitter/register").param("username", "x")) .andExpect(view().name("registerForm")); } //...其余测试逻辑 }
步骤3:正式Web环境配置(非测试场景需补充)
如果正式运行的Spring MVC环境也需要校验生效,在你的Spring MVC配置类上添加@EnableWebMvc注解即可,该注解会自动扫描类路径下的校验器并注册到Spring上下文:
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.context.annotation.ComponentScan; @Configuration @EnableWebMvc @ComponentScan(basePackages = "spittr.web") public class WebConfig { // 其余Spring MVC配置逻辑 }
内容的提问来源于stack exchange,提问作者rampion
相关产品推荐
相关产品推荐

