如何将自定义合同转换器传递给 spring 云合同 docker 图片

How to pass custom ContractConverter to spring cloud contract docker image

我想使用自定义 ContractConverter 将自定义字段添加到我的合同中。 但是 spring 云合同插件不采用我创建的 CustomContractConverter class 来处理合同。

我在 github 中创建了一个演示项目来演示这一点: https://github.com/javiersvg/custom-contracts

代码结构:

- src
  - test
    - resource
      - contracts
        - helath.yml                      -> A contract with a custom field.
      - META-INF
        - spring.factories                -> Custom contract converter configuration
    - groovy/com/.../
      - CustomContractConverter.groovy    -> Custom contract converter

如何运行:

有一个 docker-compose.yml 文件将这些文件夹的内容复制到 springcloud/spring-cloud-contract:2.2.0.BUILD-SNAPSHOT docker 图像和 运行s generateContractTests 根据合同创建测试的任务。

预期结果:

调用CustomContractConverter时抛出异常。

实际结果:

由于默认的 YamlContracConverter class 无法解释合同中的自定义字段,该过程以异常结束。

到目前为止我发现了什么:

在 docker 容器中调试 spring 合约 gradle 插件(通过将 -Dorg.gradle.debug=true 参数添加到 docker-compose.yml命令字段)我看到应该加载 spring.factories 文件的 class SpringFactoriesLoader(Line: 132) 仅从定义为依赖项的 jars 中加载具有该名称的文件,而不是我在源代码中添加的文件. 这是通过 VisitableUrlClassLoader 完成的,它引用了依赖 jar 而不是源代码。 可以证明这是因为插件在创建合约后才加载源代码,但这只是一种理论。

任何使用自定义合约转换器的经验将不胜感激。

您必须使用类路径中的文件构建您自己的映像。您的 groovy 文件需要编译。我们不会在运行时读取脚本来检索额外的转换器