Micronaut如何通过代码配置OpenAPI 解决Swagger不生效问题
Micronaut OpenAPI 模块默认采用编译时生成接口文档的机制,和SpringDoc运行时扫描上下文Bean加载自定义配置的逻辑完全不同。你之前尝试的@Singleton替换@Bean、类上加@Factory的写法,仅符合Micronaut普通Bean的注册规则,但没有命中OpenAPI模块的自定义扩展点,因此注册的OpenAPI实例不会被Swagger UI读取。
1. 校准依赖
首先排除所有SpringDoc相关依赖,仅引入Micronaut官方OpenAPI模块依赖,避免依赖冲突导致配置加载异常。
Gradle配置示例:
annotationProcessor("io.micronaut.openapi:micronaut-openapi") implementation("io.swagger.core.v3:swagger-annotations")
Maven配置需将上述依赖对应到annotation processor路径和常规依赖路径即可。
2. 通过官方扩展点编写代码式配置
不要直接注册OpenAPI类型的Bean,而是实现Micronaut提供的OpenApiCustomizer接口,该接口的实现类会在OpenAPI定义生成流程中被自动回调,允许你通过纯代码修改文档元信息,完全不需要使用注解配置文档内容。
对应原有SpringBoot逻辑的实现代码如下:
import io.micronaut.openapi.OpenApiCustomizer; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.info.License; import jakarta.inject.Singleton; @Singleton public class CustomOpenApiConfig implements OpenApiCustomizer { private final OpenApiProperties properties; // 构造器注入自定义配置类,和SpringBoot注入逻辑一致 public CustomOpenApiConfig(OpenApiProperties properties) { this.properties = properties; } @Override public void customize(OpenAPI openApi) { openApi.info(buildDocInfo()); } private Info buildDocInfo() { return new Info() .title(properties.getProjectTitle()) .description(properties.getProjectDescription()) .version(properties.getProjectVersion()) .license(buildLicense()); } private License buildLicense() { return new License() .name("Unlicense") .url("https://unlicense.org/"); } }
你的自定义OpenApiProperties类只需添加@ConfigurationProperties注解完成配置绑定,即可正常注入使用,绑定逻辑和SpringBoot基本一致。
3. 补齐基础配置
在application.yml中开启Swagger UI静态资源映射,避免默认配置屏蔽文档加载:
micronaut: router: static-resources: swagger: paths: classpath:META-INF/swagger mapping: /swagger/** swagger-ui: paths: classpath:META-INF/swagger/views/swagger-ui mapping: /swagger-ui/** openapi: views: swagger-ui: enabled: true
- 直接将
@Bean替换为@Singleton:仅将OpenAPI对象注册到Micronaut应用上下文,但OpenAPI模块生成文档时不会主动扫描上下文里的独立OpenAPI Bean,配置自然不会生效。 - 类上添加
@Factory:本质还是普通Bean的注册逻辑,没有对接OpenAPI模块的扩展点,无法被文档生成流程感知,因此同样不生效。
若需要给Swagger UI添加Basic认证,直接通过Micronaut的安全拦截规则配置Swagger UI路径的认证逻辑即可,不需要修改OpenAPI配置本身,实现效果和你参考的方案完全一致。
内容的提问来源于stack exchange,提问作者Miguel Jr. Bermundo

