微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以为Spring和Cloud-Contract解析一个针对合同和合同测试规范的OpenApi3定义?

如何解决是否可以为Spring和Cloud-Contract解析一个针对合同和合同测试规范的OpenApi3定义?

这个想法是为合同定义和合同测试规范提供一个文件

我找到了插件'guru.springframework:spring-cloud-contract-oa3:2.1.2.0',它可以满足我的要求,但对我来说却失败了。 我基于此仓库中的示例配置 https://github.com/springframeworkguru/sccoa3-fraud-example

这是执行后的错误消息

逐步构建干净

Error Processing yaml file. Skipping Contract Generation 
java.lang.IllegalStateException: Exception occurred while processing the file [.../build/stubs/meta-inf/com.bla.bla/api-mlpe/0.0.1-SNAPSHOT/contracts/v1/0/openapi.yml]
...
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "openapi" (class org.springframework.cloud.contract.verifier.converter.YamlContract),not marked as ignorable (10 kNown properties: "response","ignored","label","outputMessage","input","name","description","request","inProgress","priority"])
 at [Source: UNKNowN; line: -1,column: -1] (through reference chain: org.springframework.cloud.contract.verifier.converter.YamlContract["openapi"])

这是我的build.gradle配置

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.springframework.cloud:spring-cloud-contract-gradle-plugin:2.2.4.RELEASE'
    }
}

plugins {
    id 'org.springframework.boot' version '2.3.4.RELEASE'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

apply plugin: 'spring-cloud-contract'

group = 'com.bla.bla'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

ext {
    set('springCloudVersion',"Hoxton.SR8")
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework:spring-web:5.2.9.RELEASE'
    implementation 'guru.springframework:spring-cloud-contract-oa3:2.1.2.0'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage',module: 'junit-vintage-engine'
    }
    testImplementation 'org.springframework.cloud:spring-cloud-starter-contract-verifier'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

contracts {
    testFramework = org.springframework.cloud.contract.verifier.config.TestFramework.junit5
}

test {
    useJUnitPlatform()
    testLogging {
        exceptionFormat = 'full'
    }
}

这是openapi.yml(基于前面提到的仓库,位于测试/资源/合同之下)

openapi: 3.0.3
info:
  description: Spring Cloud Contract Verifier Http Server OA3 Sample
  version: "1.0.0"
  title: Fraud Service API
paths:
  /v1/consumers/global-consumers:
    put:
      summary: Perform Fraud Check
      x-contracts:
        - contractId: 1
          name: Should Mark Client as Fraud
          priority: 1
        - contractId: 2
          name: Should Not Mark Client as Fraud
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                "client.id":
                  type: integer
                loanAmount:
                  type: integer
#START REQUEST - part with SPEC deFinitions
        x-contracts:
          - contractId: 1
            body:
              "client.id": 1234567890
              loanAmount: 99999
            matchers:
              body:
                - path: $.['client.id']
                  type: by_regex
                  value: "[0-9]{10}"
          - contractId: 2
            body:
              "client.id": 1234567890
              loanAmount: 123.123
            matchers:
              body:
                - path: $.['client.id']
                  type: by_regex
                  value: "[0-9]{10}"
#END REQUEST - part with SPEC deFinitions
      responses:
        '200':
          description: created ok
          content:
            application/json:
              schema:
                type: object
                properties:
                  fraudCheckStatus:
                    type: string
                  "rejection.reason":
                    type: string
#START RESPONSE - part with SPEC deFinitions
          x-contracts:
            - contractId: 1
              body:
                fraudCheckStatus: "FRAUD"
                "rejection.reason": "Amount too high"
              headers:
                Content-Type: application/json;charset=UTF-8
            - contractId: 2
              body:
                fraudCheckStatus: "OK"
                "rejection.reason": null
              headers:
                Content-Type: application/json;charset=UTF-8
              matchers:
                body:
                  - path: $.['rejection.reason']
                    type: by_command
                    value: assertthatRejectionReasonIsNull($it)
#END RESPONSE - part with SPEC deFinitions

除了失败的事实外,我不确定我的配置是否适合实现我的目标:-) 我的目标是要有一个描述合同的文件(在OpenApi3标准中),包括合同测试规范(在同一个文件中,不应违反OpenAPI3规范标准),并基于此文件生成

  • api模型类
  • java伪装类
  • 节点存根模块
  • wiremock存根
  • api合约测试(junit5或Spock)

是否可以按照我指定的方式将它们全部包含?如果是,如何实现? 在提供的配置中,提到的插件不适用于我。

解决方法

您需要将guru.springframework:spring-cloud-contract-oa3:2.1.2.0依赖项添加到插件的类路径,而不是项目的类路径。

不是这样的:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.springframework.cloud:spring-cloud-contract-gradle-plugin:2.2.4.RELEASE'
    }
}

plugins {
    id 'org.springframework.boot' version '2.3.4.RELEASE'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

赞:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.springframework.cloud:spring-cloud-contract-gradle-plugin:2.2.4.RELEASE'
        classpath 'guru.springframework:spring-cloud-contract-oa3:2.1.2.0'
    }
}

plugins {
    id 'org.springframework.boot' version '2.3.4.RELEASE'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

我们也在文档中(在另一个示例中)https://docs.spring.io/spring-cloud-contract/docs/2.2.4.RELEASE/reference/html/advanced.html#customization-plugin-dep

中对此进行了描述。

哦,这样一个la脚的错误。谢谢@ marcin-grzejszczak 应用更改后,看起来会更好。解析yaml规范有效。

现在我在 generateClientStubs

中遇到了问题

运行后 gradle clean build -x test --stacktrace

我要

Execution failed for task ':generateClientStubs'.
13:43:33.759 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] > Class org.springframework.cloud.contract.verifier.converter.YamlContract does not implement the requested interface groovy.lang.GroovyObject
….
Caused by: java.lang.IncompatibleClassChangeError: Class org.springframework.cloud.contract.verifier.converter.YamlContract does not implement the requested interface groovy.lang.GroovyObject
        at org.springframework.cloud.contract.verifier.converter.OpenApiContractConverter$_convertFrom_closure2$_closure5$_closure6.doCall(OpenApiContractConverter.groovy:84)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

我发现前一段时间报告的问题看起来很相似 [https://github.com/spring-cloud/spring-cloud-contract/issues/1289] 现在,我的构建gradle中定义的版本是两天前通过spring initializr生成的版本,因此我假设它们应该兼容。 此问题是否可能来自添加的“ guru.springframework:spring-cloud-contract-oa3”插件? 乍一看,它看起来像上面提到的类似报道的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。