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()) } } }
关键说明
- 路径变量定义:通过
urlPath的闭包参数,为路径占位符${accountId}绑定正则规则,确保Spring Cloud Contract能正确解析路径变量,同时生成合法的正则表达式。 - 响应变量复用:使用
fromRequest().path("accountId")在响应中引用请求路径里的accountId变量,实现请求值到响应的复用。 - 消费者/生产者区分:
value(consumer(...), producer(...))分别为消费者测试(Stub侧)和生产者测试(契约验证侧)指定规则,消费者侧用anyNumber()匹配任意数字,生产者侧则直接复用请求的路径变量值。
执行cloud:spring-cloud-contract-maven-plugin:4.0.0:generateTests即可正常生成测试代码,且响应会正确复用请求的路径变量值。
内容的提问来源于stack exchange,提问作者Anna Klein
相关产品推荐
相关产品推荐

