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

Spring Cloud Contract复用请求路径变量至响应时遇正则语法异常求助

解决Spring Cloud Contract复用请求路径变量到响应时的正则语法异常

问题原因

直接拼接anyNumber()到正则字符串的写法有误。anyNumber()返回的是DslProperty对象而非纯正则表达式字符串,拼接后生成的内容包含对象的toString输出(如ClientDslProperty{clientValue=-?(\d*\.\d+|\d+), serverValue=-90366052}),这会导致正则语法非法,触发PatternSyntaxException。

正确实现方式

要复用请求路径变量到响应,需先为路径变量命名,再通过fromRequest()引用该变量。以下是修正后的契约代码:

Contract.make {
    description("""
Represents a successful scenario of getting an account

given:
account id
when:
api request for an account
then:
return account

""")
    request {
        method 'GET'
        // 为路径变量命名并指定正则规则
        urlPath('/api/v1/account/${accountId}') {
            accountId(regex(anyNumber().toString()))
        }
    }
    response {
        status 200
        body(
            // 从请求路径中引用名为accountId的变量
            accountNumber: value(consumer(anyNumber()), producer(fromRequest().path("accountId")))
        )
        headers {
            contentType(applicationJson())
        }
    }
}

关键说明

  1. 路径变量定义:通过urlPath的闭包参数,为路径占位符${accountId}绑定正则规则,确保Spring Cloud Contract能正确解析路径变量,同时生成合法的正则表达式。
  2. 响应变量复用:使用fromRequest().path("accountId")在响应中引用请求路径里的accountId变量,实现请求值到响应的复用。
  3. 消费者/生产者区分:value(consumer(...), producer(...))分别为消费者测试(Stub侧)和生产者测试(契约验证侧)指定规则,消费者侧用anyNumber()匹配任意数字,生产者侧则直接复用请求的路径变量值。

执行cloud:spring-cloud-contract-maven-plugin:4.0.0:generateTests即可正常生成测试代码,且响应会正确复用请求的路径变量值。

内容的提问来源于stack exchange,提问作者Anna Klein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:15:36