SpringBoot не загружает контроллеры, созданные с использованием OpenAPI 3.0 - PullRequest
0 голосов
/ 26 мая 2020

Я генерирую код, используя openapi-generator-maven-plugin. Код создается успешно. Но весенняя загрузка не загружает сгенерированный код в контексте. Я не уверен, почему, потому что я сделал следующее.

Ниже представлена ​​моя конфигурация плагина:

<plugin>
    <groupId>org.openapitools</groupId>
    <artifactId>openapi-generator-maven-plugin</artifactId>
    <version>4.3.1</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <inputSpec>${project.basedir}/src/main/resources/spec/SchoolAPIs.v1.yaml</inputSpec>
                <output>${project.build.directory}/server</output>
                <language>spring</language>
                <apiPackage>com.school.rest.controllers</apiPackage>
                <modelPackage>com.school.rest.generated.dtos</modelPackage>
                <supportingFilesToGenerate>ApiUtil.java</supportingFilesToGenerate>
                <library>spring-boot</library>
                <configOptions>
                    <java8>false</java8>
                    <dateLibrary>java8</dateLibrary>
                    <delegatePattern>true</delegatePattern>
                    <useBeanValidation>true</useBeanValidation>
                </configOptions>
            </configuration>
        </execution>
    </executions>
</plugin>

Ниже мой основной класс, в котором я указал конфигурацию:

@EnableSwagger2
@EnableAsync
@SpringBootApplication(exclude = SecurityAutoConfiguration.class, scanBasePackages = { "com.school.rest"})
@EnableJpaRepositories(basePackages = "com.school.rest.repository")
@Slf4j
public class SchoolAPIApplication implements CommandLineRunner {

    public static void main(String[] args) {
        ApplicationContext context = new SpringApplicationBuilder(SchoolAPIApplication.class)
                .registerShutdownHook(true).run(args);
        PlansApiController plansApiController = context.getBean(PlansApiController.class);
        log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>> {}", plansApiController);
    }

}

Я не уверен, что здесь не так, боролся с этим почти 2 дня. Не могу понять, чего не хватает.

Сообщите мне, есть ли у вас какие-либо решения.

Обновление: этот вызов приводит к следующей ошибке>

log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>> {}", plansApiController);

Ошибка:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type...

С уважением

Ответы [ 2 ]

0 голосов
/ 01 июня 2020

Хорошо, поэтому для меня ответ будет таким:

Я столкнулся с проблемой из-за более низкой версии spring-boot, которая не поддерживала чтение с генерируемых интерфейсов. И по этой причине генератор кода генерировал код с интерфейсами, аннотированными всей документацией, но не читался пружиной и не добавлялся в контекст.

Обновите мою весеннюю версию с 2.0.0 до 2.1.4, и все будет исправлено. Публикация здесь для справки.

0 голосов
/ 26 мая 2020

Судя по тому, что я вижу, ваши сгенерированные пакеты не сканируются при запуске. Я попытался воссоздать вашу проблему и решение здесь https://github.com/tinashehondo/notifications-api

<plugin>
            <groupId>org.openapitools</groupId>
            <artifactId>openapi-generator-maven-plugin</artifactId>
            <version>4.0.0</version>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                    <configuration>
                        <inputSpec>${project.basedir}/src/main/resources/api.yaml</inputSpec>
                        <output>${project.build.directory}/api</output>
                        <language>spring</language>
                        <modelPackage>uk.co.tinashehondo.notifications.rest.model</modelPackage>
                        <apiPackage>uk.co.tinashehondo.notifications.rest.api</apiPackage>
                        <generateSupportingFiles>true</generateSupportingFiles>
                        <configOptions>
                            <java8>false</java8>
                            <dateLibrary>java8</dateLibrary>
                            <delegatePattern>true</delegatePattern>
                            <useBeanValidation>true</useBeanValidation>
                        </configOptions>
                    </configuration>
                </execution>
            </executions>
        </plugin>

и

@SpringBootApplication(exclude = SecurityAutoConfiguration.class,
     scanBasePackages = { "uk.co.tinashehondo.notifications.rest"})
 public class App {
   public static void main(String[] args) {
    ApplicationContext context = new        SpringApplicationBuilder(App.class)
            .registerShutdownHook(true).run(args);
    NotificationApi notificationApiController =    context.getBean(NotificationApi.class);
    System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>> {}"+notificationApiController); //forgive sys.out here
}

}

Выход

>>>>>>>>>>>>>>>>>>>>>>>>>>>>     {}uk.co.tinashehondo.notifications.rest.api.NotificationApiController@7b948f3e
...