Spring Contract DLS中如何阻止字符串JSON被转为实际JSON?
Spring Cloud Contract: 避免字符串JSON被自动解析为JSON结构
问题分析
你碰到的这个问题是Spring Cloud Contract在序列化请求Body时,会自动把字符串形式的JSON(比如{})解析成JSON对象,导致生成的测试代码里没有将它作为字符串值包裹起来,不符合预期。
临时解决办法
在官方修复这个Bug之前,你可以通过以下两种临时方案绕过这个问题:
方案1:转义字符串中的引号
修改你的VALID_JSON_STRING定义,把目标JSON字符串包裹在转义的引号里:
VALID_JSON_STRING = '\"{}\"' [ Contract.make { name("insertSomething_ShouldReturnHttp200") description("POST should do sth") request { method 'POST' url REQUEST_URL body( value: VALID_JSON_STRING ) headers { contentType(applicationJson()) } } response { status 200 headers { contentType(applicationJson()) } } } ]
方案2:在Body中构造带引号的字符串
如果不想修改常量定义,也可以直接在Body字段里通过GString构造带引号的目标值:
VALID_JSON_STRING = '{}' [ Contract.make { name("insertSomething_ShouldReturnHttp200") description("POST should do sth") request { method 'POST' url REQUEST_URL body( value: "\"${VALID_JSON_STRING}\"" ) headers { contentType(applicationJson()) } } response { status 200 headers { contentType(applicationJson()) } } } ]
这两种方式都会让生成的测试代码里的Body变成你预期的.body("{\"value\":\"{}\"}");。
官方状态
编辑:该问题已被标记为Spring Cloud Contract的官方Bug,后续官方修复完成后就无需再使用这些临时方案了。
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

