Фильтр: [?] нельзя применять к примитивам, обрабатывающим Spring Cloud Contract DSL

У меня есть 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? Правильно ли выражена часть тела «полезной нагрузки»?


person James Swafford    schedule 21.09.2017    source источник
comment
Еще одно замечание - это использование 1.1.3.RELEASE.   -  person James Swafford    schedule 21.09.2017
comment
payload выглядит неправильно... Обратите внимание, что payload рассматривается как значение String, а не Map. Как вы думаете, вы могли бы поделиться своим проектом где-нибудь? Кажется, что преобразование сообщения в String нарушено, но без дополнительной информации (например, что вы используете для обмена сообщениями - stream/integration/amqp/camel) вам будет трудно помочь   -  person Marcin Grzejszczak    schedule 22.09.2017
comment
У меня было ощущение, что проблема может быть в самой полезной нагрузке. Я не уверен, что смогу это изменить. Если это действительно проблема, можно ли настроить способ анализа полезной нагрузки? Возможно, написав собственный ContractVerifierObjectMapper?   -  person James Swafford    schedule 25.09.2017
comment
ContractVerifierObjectMapper — это bean-компонент, который вводится. Вы можете переопределить это   -  person Marcin Grzejszczak    schedule 25.09.2017
comment
Вы также можете просто предоставить свою собственную реализацию ObjectMapper, и она также будет отражена в ContractVerifierObjectMapper   -  person Marcin Grzejszczak    schedule 25.09.2017
comment
Повлияют ли заголовки сообщений на конверсию?   -  person James Swafford    schedule 25.09.2017
comment
Я так не думаю.   -  person Marcin Grzejszczak    schedule 25.09.2017
comment
Вы правы, полезная нагрузка неверна, в результате чего она обрабатывается как строка. Если вы хотите сформулировать это как ответ, я соглашусь. Еще раз спасибо, Марчин.   -  person James Swafford    schedule 25.09.2017
comment
Готово! Добавил ответ. Рады, что удалось разобраться   -  person Marcin Grzejszczak    schedule 25.09.2017


Ответы (1)


Полезная нагрузка выглядит неправильно... Обратите внимание, что полезная нагрузка рассматривается как значение String вместо Map. Я думаю, достаточно изменить полезную нагрузку на правильную, и все должно снова работать!

person Marcin Grzejszczak    schedule 25.09.2017
comment
Вы очень помогли, это очень ценно. Сегодня я продемонстрировал Spring Cloud Contract своей команде, и он был хорошо принят. - person James Swafford; 26.09.2017
comment
Я очень рад это слышать! Надеюсь, инструмент сослужит вам хорошую службу! - person Marcin Grzejszczak; 26.09.2017