У меня есть DSL Spring Cloud Contract, который выглядит так:
package contracts.someconsumer.messaging
import org.springframework.cloud.contract.spec.Contract
Contract.make {
label 'my_label'
// input to the contract
input {
// the contract will be triggered by a method
triggeredBy('someMethodThatSendsMessage()')
}
// output message of the contract
outputMessage {
// destination to which the output message will be sent
sentTo 'Consumer.contractTest.VirtualTopic.some_destination'
// the body of the output message
body([
id: value(consumer('11111111-2222-3333-4444-555555555555'),producer(regex(uuid()))),
correlationId: value(producer(regex(uuid()))),
service: 'MY_SERVICE',
payload:
[
email: '[email protected]'
]
])
}
}
Без "полезной нагрузки" все работает отлично. С полезной нагрузкой я сталкиваюсь с этим исключением:
com.jayway.jsonpath.InvalidPathException: Filter: [?] can not be applied to primitives. Current context is: {"email":"[email protected]","legalName":"ACME Inc"}
at com.jayway.jsonpath.internal.path.PredicatePathToken.evaluate(PredicatePathToken.java:66) ~[json-path-2.2.0.jar:2.2.0]
at com.jayway.jsonpath.internal.path.PathToken.handleObjectProperty(PathToken.java:81) ~[json-path-2.2.0.jar:2.2.0]
at com.jayway.jsonpath.internal.path.PropertyPathToken.evaluate(PropertyPathToken.java:79) ~[json-path-2.2.0.jar:2.2.0]
at com.jayway.jsonpath.internal.path.RootPathToken.evaluate(RootPathToken.java:62) ~[json-path-2.2.0.jar:2.2.0]
Соответствующая строка из сгенерированного теста:
assertThatJson(parsedJson).field("['payload']").field("['email']").isEqualTo("[email protected]");
Еще немного информации, вот как выглядит сериализованное сообщение:
2017-09-21 08:32:03.721 INFO 10716 --- [ main] c.v.sccdemo.producer.InviteServiceImpl : Event: {"id":"e63de44e-6e1a-4c4e-b98b-3c49a49efc9c","destination":"VirtualTopic.some_destination","correlationId":"8efb9740-5651-4068-8a6e-574ae7759552","service":"MY_SERVICE","payload":"{\"email\":\"[email protected]\",\"legalName\":\"ACME Inc\"}","timestamp":1505997123576,"version":"v1"}
Я делаю что-то не так в DSL? Правильно ли выражена часть тела «полезной нагрузки»?
payload
выглядит неправильно... Обратите внимание, чтоpayload
рассматривается как значениеString
, а неMap
. Как вы думаете, вы могли бы поделиться своим проектом где-нибудь? Кажется, что преобразование сообщения в String нарушено, но без дополнительной информации (например, что вы используете для обмена сообщениями - stream/integration/amqp/camel) вам будет трудно помочь - person Marcin Grzejszczak   schedule 22.09.2017ContractVerifierObjectMapper
— это bean-компонент, который вводится. Вы можете переопределить это - person Marcin Grzejszczak   schedule 25.09.2017ObjectMapper
, и она также будет отражена вContractVerifierObjectMapper
- person Marcin Grzejszczak   schedule 25.09.2017