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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:31:12