我的应用程序使用spring 2.5.5。
在应用程序启动时,我将Tomcat的属性设置为allow encoded slash in @PathVariable
:
@SpringBootApplication
public class App {
public static void main(String[] args) {
System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");
SpringApplication.run(App.class, args);
}
}
当我启动应用程序时,一切都很好,除了集成测试之外:
@ActiveProfiles("test-connected")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@ExtendWith(SpringExtension.class)
class GlobalFullTest {
调试org.apache.tomcat.util.buf.UDecoder
类时:当加载类时,我看到属性org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH
是null
,因此设置了默认值false
。
我尝试了以下几点:
application-test-connected.yaml
WebServerFactoryCustomizer
:H 222F 223
中添加properties = { "org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true" }
的测试
@BeforeAll
方法中的System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");
@Configuration
public class WebServerConfiguration {
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> customizer() {
return factory -> factory.addConnectorCustomizers(connector -> connector.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true"));
}
}
但是所有这些都不起作用:当属性被org.apache.tomcat.util.buf.UDecoder
类检索时,它的值总是null
。
如何在加载org.apache.tomcat.util.buf.UDecoder
类之前设置属性?
发布于 2022-10-04 13:18:22
提及How to set environment variable or system property in spring tests?
最简单的方法
遵循add static initializer in the class
...
class GlobalFullTest {
static {
System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");
}
...
}
down side is we need to copy that for every test.
清洁道
create ApplicationContextInitializer,可以重用in the Spring application和任何其他测试。
public class CustomApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>
{
@Override
public void initialize(ConfigurableApplicationContext applicationContext)
{
System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");
}
}
...
@ContextConfiguration(initializers = CustomApplicationContextInitializer.class,...)
class GlobalFullTest {
...
https://stackoverflow.com/questions/73947706
复制相似问题