Пример на основе Maven создает исключение

#openapi #spring-cloud-contract

Вопрос:

У меня возникает очень похожая проблема с некоторыми другими, которые пытаются использовать плагин spring-cloud-contract-oa3 и контракты в спецификации openapi YAML.

Я использую maven с 2.1.2.0 плагина и 3.0.3 SCC —

     <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-contract-maven-plugin</artifactId>
                <version>3.0.3</version>
                <extensions>true</extensions>
                <configuration>
                    <testFramework>JUNIT5</testFramework>
                    <baseClassForTests>com.bt.b2c.oa3cdc.contracts.BaseTestClass</baseClassForTests>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>guru.springframework</groupId>
                        <artifactId>spring-cloud-contract-oa3</artifactId>
                        <version>2.1.2.0</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
 

Что я немного подозреваю, так это то, что ошибки как бы подразумевают использование синтаксического анализатора по умолчанию (и, следовательно, будут нарушены). В приведенном ниже журнале разве мы не ожидали бы увидеть использование OpenApiContractConverter?

     [DEBUG] Parsed rootNode: {"openapi":"3.0.1", ..... }
    [ERROR] Unexpected error in reading contract file
    [ERROR] Cannot compare java.util.ArrayList with value '[null, null]' and java.lang.Integer with value '0'
    [WARNING] Error Processing yaml file. Skipping Contract Generation 
    java.lang.IllegalStateException: Exception occurred while processing the file [E:gitselfserveoa3cdcsrctestresourcescontractsincidents_openapi.yaml]
        at org.springframework.cloud.contract.verifier.converter.YamlToContracts.convertFrom(YamlToContracts.java:94)
        at org.springframework.cloud.contract.verifier.converter.YamlContractConverter.isAccepted(YamlContractConverter.java:63)
        at org.springframework.cloud.contract.verifier.file.ContractFileScanner.tryConvert(ContractFileScanner.java:320)
        at org.springframework.cloud.contract.verifier.file.ContractFileScanner.addContractToTestGeneration(ContractFileScanner.java:302)
        at org.springframework.cloud.contract.verifier.file.ContractFileScanner.appendRecursively(ContractFileScanner.java:268)
        at org.springframework.cloud.contract.verifier.file.ContractFileScanner.findContractsRecursively(ContractFileScanner.java:237)
        at org.springframework.cloud.contract.verifier.TestGenerator.generateTestClasses(TestGenerator.java:131)
        at org.springframework.cloud.contract.verifier.TestGenerator.generate(TestGenerator.java:111)
        at org.springframework.cloud.contract.maven.verifier.GenerateTestsMojo.execute(GenerateTestsMojo.java:300)
 

Есть какие-нибудь идеи? Я подозреваю, что сделал что-то глупое, но я этого не вижу

Ответ №1:

Вы используете контракт Spring Cloud в версии 3.0.3 и плагин openapi в версии 2.1.2.0, несовместимый с SCC 3.0.3. В моей ветке плагина в upgrade ветке я обновил плагин, чтобы он был совместим с SCC 3.0.x. Для его использования вам следует использовать jitpack.io следующим образом

 <build>
    <plugins>
        <plugin>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-contract-maven-plugin</artifactId>
            <version>3.0.3</version>
            <extensions>true</extensions>
            <configuration>
                <testFramework>JUNIT5</testFramework>
                <baseClassForTests>com.bt.b2c.oa3cdc.contracts.BaseTestClass</baseClassForTests>
            </configuration>
            <dependencies>
                <!-- Until a Spring Cloud Contract 3.0.x compatible version gets released -->
                <dependency>
                    <groupId>com.github.marcingrzejszczak</groupId>
                    <artifactId>spring-cloud-contract-oa3</artifactId>
                    <version>upgrade-SNAPSHOT</version>
                </dependency>
            </dependencies>
        </plugin>           
    </plugins>
</build>

<pluginRepositories>
    <pluginRepository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </pluginRepository>
</pluginRepositories>
 

Комментарии:

1. Марчин, спасибо за информацию. Что сказал, Я не могу получить, чтобы работать, и Maven жалуется с: «не удалось передать артефакт ком.в GitHub.marcingrzejszczak:весна-облако-договор-оа3:пом:весна-облако-договор-3.0.X с/с jitpack.Ио ( jitpack.Ио ): перевод не jitpack.Ио/ком/гитхаб/marcingrzejszczak/… »

2. Пожалуйста, попробуйте еще раз — я могу получить доступ к этому файлу jitpack.io/com/github/marcingrzejszczak/…

3. Привет, да, я могу вытащить файл POM сейчас (некоторые прокси выдают мой конец), но теперь я получаю жалобу после этого на банку : Caused by: org.eclipse.aether.transfer.ArtifactNotFoundException: Could not find artifact com.github.marcingrzejszczak:spring-cloud-contract-oa3:jar:spring-cloud-contract-3.0.x in jitpack.io (https://jitpack.io)

4. Хорошо, я обновил ответ. Очевидно, вы не можете использовать мой тег — вам придется использовать ветку. Поэтому установите версию в upgrade-SNAPSHOT . jitpack.io/#marcingrzejszczak/spring-cloud-contract-oa3/…

5. Взглянув на это еще раз, я действительно вижу, что конвертер OpenAPI найден на заводе spring и находится в списке из 3 возможных конвертеров. Отладка maven, хотя кажется, что при попытке с помощью этого.tryConvert(конвертер,файл) вызывает исключение IllegalStateException. Я попробую с другим примером файла oa3 yaml