Pact JVM 更新向后兼容性
Pact JVM update backwards compatibility
我正在尝试将许多服务从 au.com.dius:pact-jvm-consumer-junit_2.11:3.2.13
更新到 au.com.dius:pact-jvm-consumer-junit_2.12:3.5.12
,但似乎新的消费者版本正在生成旧提供者版本 (au.com.dius:pact-jvm-provider-junit_2.11:3.2.13
) 无法处理的协议.
旧协议有一个哈希图,在根部添加了匹配规则,如下所示
{
"consumer": {
"name": "consumer-amqp"
},
"provider": {
"name": "prodvider-amqp"
},
"messages": [
{
"description": "amqp contract",
"contents": {
"body": {
"guidProperty": "795ecfd5-a3a5-430f-a0cd-1569df61bff6"
}
},
"matchingRules": {
"$.body.body.guidProperty": {
"regex": "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"
}
}
}
],
"metadata": {
"pact-specification": {
"version": "3.0.0"
},
"pact-jvm": {
"version": "3.2.13"
}
}
}
新消费者在匹配器周围添加和包装器 body
。下面是使用新的消费者版本
生成的相同契约的示例
{
"consumer": {
"name": "consumer-amqp"
},
"provider": {
"name": "prodiver-amqp"
},
"messages": [
{
"description": "contract",
"contents": {
"body": {
"guidProperty": "e2490de5-5bd3-43d5-b7c4-526e33f71304"
}
},
"matchingRules": {
"body": {
"$.guidProperty": {
"matchers": [
{
"match": "regex",
"regex": "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"
}
],
"combine": "AND"
}
}
}
}
],
"metadata": {
"pact-specification": {
"version": "3.0.0"
},
"pact-jvm": {
"version": "3.5.12"
}
}
}
由于该更改,提供程序无法解析匹配规则并出现以下错误:
body
^
10:21:24.526 [main] DEBUG au.com.dius.pact.matchers.JsonBodyMatcher - compareValues: No matcher defined for path List($, body, body, guidProperty), using equality
10:21:24.527 [main] WARN au.com.dius.pact.matchers.Matchers$ - Path expression body is invalid, ignoring: [1.1] failure: `$' expected but `b' found
java.lang.AssertionError:
comparison
{$.body.body.guidProperty=Expected 'e2490de5-5bd3-43d5-b7c4-526e33f71304' but received 'aff876f5-5014-937c-6855-c099f9857437'
查看 v3 spec the new message seems to be valid, does the old provider library (v3.2.13) not support it? I looked through the code and found this commit,在我看来,这是引入更改的地方。
根据我的测试,新的提供者库 (3.5.12) 可以处理新旧格式,但是如果类路径中同时存在新的提供者库和旧的消费者库,http 合同测试将失败并显示 运行 -时间错误。
问题:
1) 有没有办法强制新消费者以旧方式创建契约,这种形式是否符合规范?
2) 有没有一种方法可以将提供者更新到新版本并且路径中仍然有旧的消费者库并且不会失败?
正如 J_A_X 所指出的,您引用的提交似乎修复了一个错误,其中本应为版本 3 的契约并不完全符合版本 3(它们使用旧的匹配器格式)
1) Is there a way to force the new consumer to create the pacts the old way, and is that form spec compliant?
是的,是的。您应该能够通过将系统 属性 pact.provider.version
设置为 2
来解决此问题 - 然后旧版本和新版本都将能够读取生成的协议。
2) Is there a way to update the provider to the new version and still have the old consumer library in the path and not get failures?
是的,只要您要求旧的消费者版本生成版本 2
契约(但理想情况下,为什么不将两者都更新到同一版本?)
我正在尝试将许多服务从 au.com.dius:pact-jvm-consumer-junit_2.11:3.2.13
更新到 au.com.dius:pact-jvm-consumer-junit_2.12:3.5.12
,但似乎新的消费者版本正在生成旧提供者版本 (au.com.dius:pact-jvm-provider-junit_2.11:3.2.13
) 无法处理的协议.
旧协议有一个哈希图,在根部添加了匹配规则,如下所示
{
"consumer": {
"name": "consumer-amqp"
},
"provider": {
"name": "prodvider-amqp"
},
"messages": [
{
"description": "amqp contract",
"contents": {
"body": {
"guidProperty": "795ecfd5-a3a5-430f-a0cd-1569df61bff6"
}
},
"matchingRules": {
"$.body.body.guidProperty": {
"regex": "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"
}
}
}
],
"metadata": {
"pact-specification": {
"version": "3.0.0"
},
"pact-jvm": {
"version": "3.2.13"
}
}
}
新消费者在匹配器周围添加和包装器 body
。下面是使用新的消费者版本
{
"consumer": {
"name": "consumer-amqp"
},
"provider": {
"name": "prodiver-amqp"
},
"messages": [
{
"description": "contract",
"contents": {
"body": {
"guidProperty": "e2490de5-5bd3-43d5-b7c4-526e33f71304"
}
},
"matchingRules": {
"body": {
"$.guidProperty": {
"matchers": [
{
"match": "regex",
"regex": "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"
}
],
"combine": "AND"
}
}
}
}
],
"metadata": {
"pact-specification": {
"version": "3.0.0"
},
"pact-jvm": {
"version": "3.5.12"
}
}
}
由于该更改,提供程序无法解析匹配规则并出现以下错误:
body
^
10:21:24.526 [main] DEBUG au.com.dius.pact.matchers.JsonBodyMatcher - compareValues: No matcher defined for path List($, body, body, guidProperty), using equality
10:21:24.527 [main] WARN au.com.dius.pact.matchers.Matchers$ - Path expression body is invalid, ignoring: [1.1] failure: `$' expected but `b' found
java.lang.AssertionError:
comparison
{$.body.body.guidProperty=Expected 'e2490de5-5bd3-43d5-b7c4-526e33f71304' but received 'aff876f5-5014-937c-6855-c099f9857437'
查看 v3 spec the new message seems to be valid, does the old provider library (v3.2.13) not support it? I looked through the code and found this commit,在我看来,这是引入更改的地方。
根据我的测试,新的提供者库 (3.5.12) 可以处理新旧格式,但是如果类路径中同时存在新的提供者库和旧的消费者库,http 合同测试将失败并显示 运行 -时间错误。
问题:
1) 有没有办法强制新消费者以旧方式创建契约,这种形式是否符合规范?
2) 有没有一种方法可以将提供者更新到新版本并且路径中仍然有旧的消费者库并且不会失败?
正如 J_A_X 所指出的,您引用的提交似乎修复了一个错误,其中本应为版本 3 的契约并不完全符合版本 3(它们使用旧的匹配器格式)
1) Is there a way to force the new consumer to create the pacts the old way, and is that form spec compliant?
是的,是的。您应该能够通过将系统 属性 pact.provider.version
设置为 2
来解决此问题 - 然后旧版本和新版本都将能够读取生成的协议。
2) Is there a way to update the provider to the new version and still have the old consumer library in the path and not get failures?
是的,只要您要求旧的消费者版本生成版本 2
契约(但理想情况下,为什么不将两者都更新到同一版本?)