问题描述
我找到了插件'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规范标准),并基于此文件生成:
是否可以按照我指定的方式将它们全部包含?如果是,如何实现? 在提供的配置中,提到的插件不适用于我。
解决方法
您需要将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”插件? 乍一看,它看起来像上面提到的类似报道的问题。