【发布时间】: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