如何在@SpringBootTest测试中提前设置Tomcat的ALLOW_ENCODED_SLASH属性?
Spring Boot 2.5.5集成测试中如何在UDecoder类加载前设置ALLOW_ENCODED_SLASH属性
核心问题原因
org.apache.tomcat.util.buf.UDecoder的ALLOW_ENCODED_SLASH是类加载阶段初始化的静态变量,一旦类被加载,该值就会固定为默认的false。你之前尝试的方法要么执行时机晚于类加载,要么无法传递到JVM系统属性层面,因此都无效。
有效解决方案
方案1:测试类添加静态代码块
静态代码块会在测试类加载时执行,早于Spring上下文初始化和UDecoder类加载,能确保系统属性在UDecoder初始化前被设置:
@ActiveProfiles("test-connected") @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @TestInstance(TestInstance.Lifecycle.PER_CLASS) @ExtendWith(SpringExtension.class) class GlobalFullTest { // 静态代码块优先执行,提前设置系统属性 static { System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true"); } // 测试方法及其他逻辑... }
方案2:配置JVM启动参数
直接在测试的JVM启动参数中添加系统属性,从根源上确保UDecoder加载时能读取到正确值:
- IDEA中:在测试运行配置的
VM options里添加-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true - Maven中:通过Surefire插件配置全局测试参数
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <argLine>-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true</argLine> </configuration> </plugin> </plugins> </build>
为什么之前的方法无效?
@BeforeAll:执行时机在Spring上下文初始化之后,此时UDecoder已经完成类加载,系统属性设置晚于静态变量初始化@SpringBootTest(properties)或yaml配置:这些是Spring环境属性,而非JVM系统属性,UDecoder直接读取的是系统属性,因此无法生效WebServerFactoryCustomizer:仅能修改Tomcat连接器的运行时属性,无法改变UDecoder类加载阶段就固定的静态变量值
内容的提问来源于stack exchange,提问作者Dartz
相关产品推荐
相关产品推荐

