当前位置: 首页 > 知识库问答 >
问题:

Spring Cloud合约-是否可以在合约的消息体中使用二进制有效负载

陆雅志
2023-03-14

从Spring Cloud合约引用留档中,可以使用以下基于消息传递的合约

def contractDsl = Contract.make {
label 'some_label'
input {
    messageFrom('jms:delete')
    messageBody([
            bookName: 'foo'
    ])
    messageHeaders {
        header('sample', 'header')
    }
    assertThat('bookWasDeleted()')
}

是否可以使用非json字符串的替代消息体类型,例如,使用二进制序列化机制的有效负载?

如果是这样,是否可以使用合约测试基类中的方法来返回此消息正文?

共有1个答案

禄光霁
2023-03-14

在Finchley中,至少对于Spring Cloud Stream支持,我们将正文转换为字节,不管您在那里传递什么。如果你不喜欢默认设置,你可以做的就是实现你自己的org。springframework。云合同验证者。信息。MessageVerifier界面,告诉我们如何发送和接收消息。这对制片方来说应该没有任何问题。不幸的是,消费者方面会出现问题:|

问题是,目前当您有输入/输出大小写时,我们会尝试直接使用正文,因为它可以通过JSON路径将您的传入消息与您在合约中定义的内容相匹配。所以这里的二进制协议会失败(检查org.springframework.cloud.contract.stubrunner.messaging.stream.StubRunnerStreamMessageSelector类)。我看到的另一个问题是org.springframework.cloud.contract.stubrunner.messaging.stream.StubRunnerStreamTransex,即我们用来触发消息的转换器。它假设正文是一个字符串JSON,然后将其转换为字节。

所以简短的答案是它目前不受正确支持。然而,由于Spring Cloud合约的可插拔特性,您可以完全覆盖这些行为。您基本上可以通过属性stubrunner.stream.enabled=false禁用默认流支持,复制org.springframework.cloud.contract.stubrunner.messaging.stream包的内容,修改它以满足您的需求并注册bean。我知道这不是您所希望的答案,但我已经创建了一个问题(https://github.com/spring-cloud/spring-cloud-contract/issues/664),以便我们在未来的版本中不会忘记这一点。

 类似资料:
  • 智能合约有效性 使用此方法,可能希望确定所加载的合约地址是你所期望的智能合约。为此,你可以使用isValid合约方法,只有在合约地址中部署的字节码与智能合约封装包中的字节码匹配时才会返回true。 contract.isValid(); // returns false if the contract bytecode does not match what's deployed

  • 我整个星期都在玩Spring Cloud合同。我能够使用Spring Cloud Stream创建一个生产者和消费者应用程序来传递消息。 我正在尝试重新设计生产者端,以使用ActiveMQ(带有虚拟主题)。我想我快到了。我已经编写了自己的MessageVerifier,并将其注入到测试的基类中。现在我得到: 测试运行:1,失败:0,错误:1,跳过:0,运行时间:2.535秒 我可以从日志文件中看出

  • Some quick examples for techniques with Contracts. 获取状态变化后的值 Since a state-changing (non-constant) function can take a non-trivial amount of time to mine, the response is a transaction, and cannot ret

  • 制定合约 合同以Ethereum特有的二进制格式(Ethereum Virtual Machine(= EVM)字节码)生成在块上。然而,合同通常用更高级的语言写成,如solidity,然后编译成将被上传到blockchain上的字节码。 请注意还有其他高级语言的存在,如serpent和LLL。Legacy Mutan(早期的类C语言)不在被官方支持。 语言资源 Solidity 文档和教程 Et

  • 我正在尝试将Spring Cloud合同合并到现有项目中。我在REST方面取得了一些成功,但我正在努力设置消息端。 到目前为止,我已经在producer上建立了一个契约,它确实在target/generated test sources/contracts中生成了一个测试。我还为测试设置了一个基类。 我无法克服这个错误: 2017-09-08 17:10:51.759错误 - --[]- [ 主]

  • Solidity中合约有点类似面向对象语言中的类。合约中有用于数据持久化的状态变量(state variables),和可以操作他们的函数。调用另一个合约实例的函数时,会执行一个EVM函数调用,这个操作会切换执行时的上下文,这样,前一个合约的状态变量(state variables)就不能访问了。 创建合约 合约可以通过Solidity,或不通过Solidity创建。当合约创建时,一个和合约同名的