Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

提议:swagger分组配置实现 #5831

Open
Fnckerpoi opened this issue Jan 20, 2024 · 1 comment
Open

提议:swagger分组配置实现 #5831

Fnckerpoi opened this issue Jan 20, 2024 · 1 comment

Comments

@Fnckerpoi
Copy link

Fnckerpoi commented Jan 20, 2024

版本号:

3.6.2

前端版本:vue3版
问题描述:建议swagger优化可按模块包分组
截图&代码:

image

@Slf4j
@Configuration
@EnableConfigurationProperties(SwaggerProperties.class)
@RequiredArgsConstructor
public class SwaggerAutoConfiguration implements BeanDefinitionRegistryPostProcessor, EnvironmentAware {

    private final String swaggerPropertiesPrefix = "X.x.swagger";

    private SwaggerProperties swaggerProperties;

    /**
     * 创建swagger文档模块
     * @param name 模块名称
     * @param basePackage 扫描路径数组
     */
    private GroupedOpenApi createApi(String name, String... basePackage) {
        return GroupedOpenApi.builder().group(name).packagesToScan(basePackage).build();
    }

    /**
     * 空白分组(防止knife4j报错)
     */
    @Bean
    @ConditionalOnProperty(prefix = "X.x.swagger", value = "enabled", havingValue = "true",
            matchIfMissing = true)
    public GroupedOpenApi blankApi() {
        return this.createApi(" 空白页", "null.null");
    }

    @Bean
    @ConditionalOnProperty(prefix = "X.x.swagger", value = "enabled", havingValue = "true",
            matchIfMissing = true)
    public OpenAPI springShopOpenAPI() {
        return new OpenAPI()
            .info(new Info().title(swaggerProperties.getTitle())
                .description(swaggerProperties.getDescription())
                .version(swaggerProperties.getVersion())
                .contact(new Contact().name(swaggerProperties.getAuthor()))
                .license(new License().name(swaggerProperties.getLicenseName()).url(swaggerProperties.getLicenseUrl())))
            .externalDocs(new ExternalDocumentation().url(swaggerProperties.getTermsOfServiceUrl()));
    }

    /**
     * 手动注册swagger docket bean, 如果晚于swagger加载后, 再注入的bean将不会生效
     */
    @Override
    public void postProcessBeanDefinitionRegistry(@NotNull BeanDefinitionRegistry registry) throws BeansException {
        if (swaggerProperties.isEnabled()) {
            val basePackages = this.swaggerProperties.getBasePackages();
            AtomicInteger atomicInteger = new AtomicInteger(96);
            basePackages.forEach((name, basePackage) -> {
                val packages = ArrayUtil.toArray(basePackage, String.class);
                val bean = new RootBeanDefinition(GroupedOpenApi.class, () -> this.createApi(name, packages));
                registry.registerBeanDefinition((char) atomicInteger.incrementAndGet() + "ModelAPi", bean);
            });
        }
    }

    @Override
    public void postProcessBeanFactory(@NotNull ConfigurableListableBeanFactory beanFactory) throws BeansException {

    }

    /**
     * 获取环境变量并设置到swaggerProperties对象中, bean注册时, 参数还未进行绑定
     */
    @Override
    public void setEnvironment(@NotNull Environment environment) {
        BindResult<SwaggerProperties> bind = Binder.get(environment)
            .bind(swaggerPropertiesPrefix, SwaggerProperties.class);
        this.swaggerProperties = bind.get();
    }

}

在application配置XML

      base-packages:
        "[基础API]": cn.x.platform.baseapi
        "[身份识别和管理]": cn.x.platform.iam
        "[消息服务]": cn.x.platform.notice
        "[演示模块]": cn.x.demo
        "[可视化大屏]": cn.x.platform.visualization
        "[微信小程序]": cn.x.platform.miniapp
        "[第三方对接]":
          - cn.x.platform.starter.dingtalk
          - cn.x.platform.starter.wecom
          - cn.x.platform.starter.wechat
        "[认证与权限]":
          - cn.x.platform.starter.auth
          - cn.x.platform.starter.data.perm
        "[其他组件]":
          - cn.x.platform.starter.audit.log
          - cn.x.platform.starter.file
          - cn.x.platform.starter.quartz
          - cn.x.platform.starter.monitor
          - cn.x.platform.starter.code.gen
          - cn.x.platform.common.websocket

不管单体还是微服务都可按服务模块进行swagger文档分组。
如果有更好的base-packages,希望官方也可以优化实现,代码自动生成放到项目后,按照模块包路径自动区分识别生成分组。
当前该实现仍需要手动设置分组;
当前jeecg的swagger配置实现与该文章有点类似https://blog.csdn.net/xqnode/article/details/86557784

@hejie3225
Copy link

可以详细点吗,代码不全

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants