【问题标题】:How to pass custom ContractConverter to spring cloud contract docker image如何将自定义 ContractConverter 传递给 Spring Cloud 合约 Docker 映像
【发布时间】:2019-11-09 23:34:46
【问题描述】:

我想使用自定义 ContractConverter 将自定义字段添加到我的合同中。 但是 spring cloud 合约插件并没有使用我创建的 CustomContractConverter 类来处理合约。

我在 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 镜像中并运行 generateContractTests 根据合约创建测试的任务。

预期结果:

调用CustomContractConverter 时抛出异常。

实际结果:

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

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

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

非常感谢任何使用自定义合同转换器的经验。

【问题讨论】:

    标签: spring-cloud gradle-plugin spring-cloud-contract


    【解决方案1】:

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

    【讨论】:

    • 非常感谢您的回答。理解起来真的很有帮助。我已将 docker-compose.yml 更改为: - 将转换器添加到 src/main/ 文件夹 - 添加 compileGroovy 任务以编译转换器
    • 抱歉耽搁了。我已将 docker-compose.yml 更改为: * 将转换器添加到 src/main/ 文件夹 * 将 spring.factories 添加到资源文件夹 * 添加 compileGroovy 任务以编译转换器 - 使用常规配置复制 build.gradle 但是ContractFileScanner 仍然不带转换器
    • 你不懂。您需要创建一个包含元信息和您的设置的新项目。从中创建一个 jar 并将其应用于 gradles 插件类路径。只有这样你才能构建一个 docker 镜像
    • 我现在明白了,我已经尝试过了,它有效。非常感谢
    猜你喜欢
    • 2019-04-27
    • 1970-01-01
    • 2013-03-24
    • 2021-08-03
    • 2018-12-02
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多