【问题标题】:SpringBoot not loading controllers which are generated using OpenAPI 3.0SpringBoot 不加载使用 OpenAPI 3.0 生成的控制器
【发布时间】:2020-05-26 12:05:03
【问题描述】:

我正在使用openapi-generator-maven-plugin 生成代码。代码正在成功生成。但是spring boot没有在上下文中加载生成的代码。我不知道为什么,因为我做了以下事情。

下面是我的插件配置:

<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...

问候

【问题讨论】:

    标签: java spring spring-boot swagger openapi-generator


    【解决方案1】:

    据我所知,您生成的包在启动时没有被扫描。 我试图在这里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
    

    【讨论】:

    • 我的问题有点不同,我能够生成控制器但无法在上下文中检测到它们。
    • 是的,只是简单地生成控制器不会将它们注入上下文,你仍然需要注册它们,那些生成的控制器类没有任何允许扫描到应用程序上下文的注释,你仍然必须“实现”那些生成的接口,就像我放在那里的 sn-p 一样,只需那个 sn-p 和扫描,然后您就可以在应用程序上下文中检测到它们,
    • 那些已经实现的类,你可以用 "delegatePattern"true 生成它们——一旦你这样做,你只需要提供委托的实现,你就会有一个“PlansApi”(接口)和“PlansApiController "(接口的实现)作为生成代码的一部分。
    • 嗨@BilboBaggins,我也面临同样的问题。我的控制器已生成,但 spring 无法在上下文中添加它们。你找到解决办法了吗?如果我找到修复程序,我会更新你。
    • @BilboBaggins ,我创建了一个小项目来向您展示我的意思,看看这个 [github.com/tinashehondo/notifications-api]
    【解决方案2】:

    好吧,对我来说答案是这样的,

    我正面临这个问题,因为较低的spring-boot 版本不支持从生成的接口读取。由于这个原因,代码生成器正在生成带有所有文档注释的接口的代码,但没有被 spring 读取并添加到上下文中。

    将我的 spring 版本从 2.0.0 升级到 2.1.4,事情就解决了。 在这里发帖供其他人参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多