WireMock在Spring Bean初始化阶段请求失败问题排查
问题分析与解决方案
问题原因
你的404错误核心原因是Spring Bean初始化(@PostConstruct执行)的时机早于WireMock服务器启动和Stub配置完成,导致调用API时WireMock还没有对应的Stub映射,返回404。另外也需要确认Stub的路径匹配规则是否和实际请求一致。
解决方案
1. 调整客户端执行时机,延后到上下文完全就绪
不要在@PostConstruct中执行API调用,改为监听Spring上下文刷新完成事件,确保所有组件(包括WireMock)都初始化完毕:
@Component class DomainChecker(private val shortPixelClient: ShortPixelClient) { @EventListener(ContextRefreshedEvent::class) fun checkAndBindDomain() { // 执行域名检查与绑定逻辑 val status = shortPixelClient.checkDomainStatus("localhost") if (status == -3) { shortPixelClient.bindDomain("localhost") } } }
2. 确保WireMock与Stub在Bean初始化前就绪
如果使用Spring Boot集成WireMock,通过@AutoConfigureWireMock指定端口,并将Stub配置放在@BeforeAll/@BeforeEach中,保证在Spring上下文启动前完成Stub配置:
@SpringBootTest @AutoConfigureWireMock(port = 9000) class DomainCheckerTest { @BeforeAll fun setupWireMock() { stubFor( get(urlPathMatching("/read-domain/.*")) .willReturn( aResponse() .withStatus(200) .withBody("-3") ) ) } // 测试逻辑... }
3. 修正Stub路径匹配规则
你的请求路径是/read-domain/localhost,如果readDomainPath只设置为/read-domain,urlPathEqualTo会因为精确匹配失败导致无法命中Stub。改为模糊匹配动态域名部分:
stubFor( get(urlPathMatching("/read-domain/.*")) // 匹配所有/read-domain/开头的路径 .willReturn( aResponse() .withStatus(200) .withBody("-3") ) )
4. 强制控制Bean初始化顺序(可选)
如果必须保留@PostConstruct,可以通过@DependsOn让你的业务Bean依赖WireMock相关Bean,确保WireMock先初始化:
@Component @DependsOn("wireMockServer") class DomainChecker(private val shortPixelClient: ShortPixelClient) { @PostConstruct fun checkAndBindDomain() { // 原有逻辑... } }
内容的提问来源于stack exchange,提问作者Hantsy
相关产品推荐
相关产品推荐

